一、 並行查詢
並行查詢允許將一個sql select語句划分為多個較小的查詢,每個部分的查詢並發地運行,然后將各個部分的結果組合起來,提供最終的結果,多用於全表掃描,索引全掃描等,大表的掃描和連接、創建大的索引、分區索引掃描、大批量插入更新和刪除
1. 啟用並行查詢
SQL> ALTER TABLE T1 PARALLEL;
告知oracle,對T1啟用parallel查詢,但並行度要參照系統的資源負載狀況來確定。
利用hints提示,啟用並行,同時也可以告知明確的並行度,否則oracle自行決定啟用的並行度,這些提示只對該sql語句有效。
SQL> select /*+ parallel(t1 8) */ count(*)from t1;
SQL> select degree from user_tables where table_name='T1';
DEGREE
--------------------
DEFAULT
並行度為Default,其值由下面2個參數決定
SQL> show parameter cpu
NAME TYPE VALUE
----------------------------------------------- ------------------------------
cpu_count integer 2
parallel_threads_per_cpu integer 2
cpu_count表示cpu數
parallel_threads_per_cpu表示每個cpu允許的並行進程數
default情況下,並行數為cpu_count*parallel_threads_per_cpu
2. 取消並行設置
SQL> alter table t1 noparallel;
SQL> select degree from user_tables wheretable_name='T1';
DEGREE
----------------------------------------
1
3. 數據字典視圖
v$px_session
sid:各個並行會話的sid
qcsid:query coordinator sid,查詢協調器sid
二、 並行dml
並行dml包括insert,update,delete,merge,在pdml期間,oracle可以使用多個並行執行服務器來執行insert,update,delete,merge,多個會話同時執行,同時每個會話(並發進程)都有自己的undo段,都是獨立的一個事務,這些事務要么由pdml協調器進程提交,要么都rollback。
在一個有充足I/o帶寬的多cpu主機中,對於大規模的dml,速度可能會有很大的提升,尤其是在大型的數據倉庫環境中。
並行dml需要顯示的啟用
SQL> alter session enable parallel dml;
Disable並行dml
SQL> alter session disable parallel dml;
三、 並行ddl
並行ddl提供了dba使用全部機器資源的能力,常用的pddl有
create table as select ……
create index
alter index rebuild
alter table move
alter table split
在這些sql語句后面加上parallel子句
例
SQL> alter table t1 move parallel;
Table altered
SQL> create index T1_IDX on T1 (OWNER,OBJECT_TYPE)
2 tablespace SYSTEM
3 parallel;
4 ;
1. 用途
強行啟用並行度來執行當前SQL。這個在Oracle 9i之后的版本可以使用,之前的版本現在沒有環境進行測試。也就是說,加上這個說明,可以強行啟用Oracle的多線程處理功能。舉例的話,就像電腦裝了多核的CPU,但大多情況下都不會完全多核同時啟用(2核以上的比較明顯),使用parallel說明,就會多核同時工作,來提高效率。
但本身啟動這個功能,也是要消耗資源與性能的。所有,一般都會在返回記錄數大於100萬時使用,效果也會比較明顯。
2. 語法
/*+parallel(table_short_name,cash_number)*/
這個可以加到insert、delete、update、select的后面來使用(和rule的用法差不多,有機會再分享rule的用法)
開啟parallel功能的語句是:
alter session enable parallel dml;
這個語句是DML語句哦,如果在程序中用,用execute的方法打開。
4. Parallel也可以用於多表
多表的話,就是在第一后面,加入其他的就可以了。具體寫法如下:
/*+parallel(t,10) (b,10)*/
5. 小結
關於執行效率,建議還是多按照index的方法來提高效果。Oracle有自帶的explan road的方法,在執行之前,先看下執行計划路線,對寫好的SQL tuned之后再執行。實在沒辦法了,再用parallel方法。Parallel比較邪惡,對開發者而言,不是好東西,會養成不好習慣,導致很多bad SQL不會暴漏,SQL Tuning的能力得不到提升。我有見過某些人create table后,從不create index或primary key,認為寫SQL時加parallel就可以了。