ORACLE並行FAQ

ORACLE並行FAQ  
 
 
 
 
 
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4
 
? 什麼是並行?
 
並行是Oracle爲了提高大數據量的運算效率而提供多進程協作技術,它可以讓多個CPU同時處理一個計算任務,充分使用系統資源,提高計算效率。
 
 
? 什麼操作支持並行?
 
大部分的DML(insert/update/delete/merge)、DDL、Query都支持並行操作。
 
 
? 什麼情況下需要啓用並行?
 
並不是所有的SQL都應該使用並行。要使用並行需滿足以下兩個條件,否則結果可能適得其反:
 
1) 機器有充分的空閒資源(CPU、內存等)
 
2) 參與運算的數據量大。在當前系統初定於參與運算數據量大於10GB或者SQL運行時間超過30分鐘可考慮使用並行。
 
 
? 如何啓用並行?
 
 
可以用hint、alter session或者設置對象並行屬性三種方式設置啓用並行。三種方式任意一種就可以使並行生效,如果多種方式同時存在的話,則優先級順序是:hint -> alter session -> table/index degree。
 
 
 
hint
 
alter session
 
table/index degree
 
Query
 
select /*+ parallel(a,8) */count(1) from table_name a;
 
alter session force query parallel 8;
 
 
select count(1) from table_name a;
 
alter table table_nameparallel 8;
 
 
select count(1) from table_name a;
 
DML
 
默認情況下,parallel dml是禁用的,需要先用alter session啓用:
 
alter session enable parallel dml;
 
 
update /*+ parallel(a,8) */ table_name a set col1=1;
 
alter session forceparallel dml parallel 8;
 
 
update table_name a set col1=1;
 
alter session enableparallel dml;
 
alter table table_nameparallel 8;
 
update table_name a set col1=1;
 
以上三步缺一不可。
 
DDL
 
 
alter session forceparallel ddl parallel 8;
 
create table table_name as select * from ……
 
 
create table table_nameparallel 8 as select * from ……
 
 
create index index_name …… parallel 8;
 
 
注意:
 
1) 上述的alter session enable只是表示讓當前會話支持並行,最終並行需要通過hint或者table/index degree來實現;而alter session force表示強制並行,無需hint等配合使用。
 
2) 建議在hint或者alter session中控制並行,不要通過修改表或者索引的屬性(degree)來控制。在查詢頻繁的情況下,把表或者索引的並行度改大可能會導致嚴重的性能問題。
 
 
? 對於insert ……select ……如何設置並行?
 
insert……select….包含兩個部分,query和dml,可以爲這兩個部分分別設置並行度。因爲insert操作是dml,因此還需要通過alter session方式把pdml啓用,如:
 
 
alter session enable parallel dml;
 
 
insert /*+ append parallel(a,4) */ into table_a a
 
select /*+ parallel(b,8) */ * from table_b b where ……;
 
 
 
? 在存儲過程/包中如何啓用並行?
 
參考上文所述。唯一的區別是如果需要執行alter session,則需要用動態語句執行,如:
 
execute immediate ‘alter session enable parallel dml’;
 
 
? 並行度該設置多大?
 
一般來說,並行度越大SQL的執行效率越高,但是不建議設置超過CPU核數的並行度。在當前的RAC中,考慮到同時會有多個任務在跑,爲了不影響其他任務,並行度需要嚴格控制在32個以下,一般的建議值是8和16。
 
另外,建議並行度設置爲2的n次方,如2/4/8/16/32等。
 
 
? 既有DML又有query的SQL如何設置並行度?如insert …..select…..
 
1) 如果寫入量大,則在insert上加並行會明顯提升性能;否則在insert上加並行基本沒有什麼意義。如:
 
insert into t(game_name,num) select game_name,count(1) cnt from popt_total_login_all_his group by game_name;
 
這種SQL主要瓶頸在查詢上,寫入量很少,因此只需要在查詢部分設置並行即可。
 
 
2) 如果查詢量大,則在查詢上加並行會明顯提升性能;
 
3) 如果寫入和查詢量都大,則在兩個部分都要加並行,不要讓其中一方成爲瓶頸。
 
 
總結起來就是:瓶頸在部分,就在這部分上加並行;如果都有瓶頸,則都加並行。
 
 
對於pdml,建議:
 
1) 由於並行dml有諸多限制和弊端,因此在寫入量不大的情況下,儘量不啓用並行dml。
 
2) insert和query的並行度不一定要一致,可根據實際調整,一般設置query並行度大於等於insert並行度。並行度最好設置爲2的n次方。
 
3) 並行度不要設置超過CPU的個數
 
 
? 如何查詢並行是否起作用?
 
1) 在SQL執行的時候,在PL/SQL DEV看是否有多個活動會話執行一個SQL
 
2) SQL執行完了以後,在同一個會話查詢v$pq_sesstat
 
SQL> select * from v$pq_sesstat;
 
 
STATISTIC LAST_QUERY SESSION_TOTAL
 
------------------------------ ---------- -------------
 
Queries Parallelized 1 1
 
DML Parallelized 0 0
 
DDL Parallelized 0 0
 
 
上面的結果中,如果last_query有非0的值,表示並行起作用了。
 
 
其他方法先不告訴你了……
 
 
? 如何控制並行度?
 
可以用hint、alter session以及table/index degree指定並行度,詳細請參考上文【如何啓用並行】部分。
 
 
? 如何跨實例並行?
 
在當前的RAC環境,爲了減少cache fusion,提高效率,默認情況把SQL並行限制在同一個節點執行。如果有超超大的SQL需要多個節點同時並行,則可以用如下語句來控制並行可跨越的實例:
 
alter session set parallel_instance_group=dw; --可跨越4個節點
 
alter session set parallel_instance_group=dw1; --限制在節點1執行
 
alter session set parallel_instance_group=dw12; --限制在節點1和2執行
 
alter session set parallel_instance_group=dw124; --限制在節點1/2/4三個節點執行
 
 
以此類推。
 
 
原則上不允許跨實例並行,如果必須跨實例,則使用前需徵得DBA同意。
 
 
? 爲什麼我的SQL達不到我設定的並行度?
 
並行度受以下(不限於)條件限制:
 
1) 系統的session、process參數的設定(一般不會超過)
 
2) parallel_max_serversx限制。這個限定目前是256,意味着一個節點最多啓動256個並行從屬進程。在多用戶多SQL同時執行的情況下,很容易達到這個上限。
 
3) 對於個人用戶,當前最多隻允許4個或者10個連接同時訪問數據庫。這意味着個人用戶下,並行度不能超過4或者10。(systemuser等程序賬號不在此限制範圍之內)
 
 
? 並行有什麼弊端?
 
1) 並行dml會浪費空間,並行度越高,浪費越厲害
 
2) 被並行dml影響的表需要提交或者回滾後才能被後續的SQL使用,否則會報錯,這可能會影響事務的一致性。
 
3) 並行容易觸發異常或者bug,降低系統和程序的穩定性
 
4) ……
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章