Oracle並行FAQ

space6212發表於2019-05-28

關於Oracle並行的一些簡單小結。

[@more@] Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4

並行是Oracle為了提高大資料量的運算效率而提供多程式協作技術,它可以讓多個CPU同時處理一個計算任務,充分使用系統資源,提高計算效率。

大部分的DML(insert/update/delete/merge)DDLQuery都支援並行操作。

並不是所有的SQL都應該使用並行。要使用並行需滿足以下兩個條件,否則結果可能適得其反:

1) 機器有充分的空閒資源(CPU、記憶體等)

2) 參與運算的資料量大。在當前系統初定於參與運算資料量大於10GB或者SQL執行時間超過30分鐘可考慮使用並行。

可以用hintalter 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_name parallel 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 force parallel dml parallel 8;

update table_name a set col1=1;

alter session enable parallel dml;

alter table table_name parallel 8;

update table_name a set col1=1;

以上三步缺一不可。

DDL

alter session force parallel ddl parallel 8;

create table table_name as select * from ……

create table table_name parallel 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….包含兩個部分,querydml,可以為這兩個部分分別設定並行度。因為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個以下,一般的建議值是816

另外,建議並行度設定為2n次方,如2/4/8/16/32等。

又有querySQL如何設定並行度?如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) insertquery的並行度不一定要一致,可根據實際調整,一般設定query並行度大於等於insert並行度。並行度最好設定為2n次方。

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的值,表示並行起作用了。

其他方法先不告訴你了……

可以用hintalter 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; --限制在節點12執行

alter session set parallel_instance_group=dw124; --限制在節點1/2/4三個節點執行

以此類推。

原則上不允許跨例項並行,如果必須跨例項,則使用前需徵得DBA同意。

達不到我設定的並行度?

並行度受以下(不限於)條件限制:

1) 系統的sessionprocess引數的設定(一般不會超過)

2) parallel_max_serversx限制。這個限定目前是256,意味著一個節點最多啟動256個並行從屬程式。在多使用者多SQL同時執行的情況下,很容易達到這個上限。

3) 對於個人使用者,當前最多隻允許4個或者10個連線同時訪問資料庫。這意味著個人使用者下,並行度不能超過4或者10(systemuser等程式賬號不在此限制範圍之內)

1) 並行dml會浪費空間,並行度越高,浪費越厲害

2) 被並行dml影響的表需要提交或者回滾後才能被後續的SQL使用,否則會報錯,這可能會影響事務的一致性。

3) 並行容易觸發異常或者bug,降低系統和程式的穩定性

4) ……

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-1046630/,如需轉載,請註明出處,否則將追究法律責任。

相關文章