Oracle並行FAQ
關於Oracle並行的一些簡單小結。
[@more@]
並行是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_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….包含兩個部分,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等。
又有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同意。
達不到我設定的並行度?
並行度受以下(不限於)條件限制:
1) 系統的session、process引數的設定(一般不會超過)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle的並行世界Oracle並行
- Oracle“並行執行”——監控檢視Oracle並行
- Oracle 中的並行系列(一)Oracle並行
- oracle表查詢的並行度Oracle並行
- oracle 並行查詢時並行資源分配追蹤測試Oracle並行
- Oracle中的並行系列(二):你設定的並行真的生效了嗎?Oracle並行
- Docker FAQDocker
- Volatility FAQ
- Seneca FAQ
- FAQ docker執行tomcat提示找不到檔案DockerTomcat
- 【FAQ】獲取Push Token失敗,如何進行排查?
- MaxCompute studio FAQ
- 【譯】ConfigureAwait FAQAI
- 不為人知的技術--Oracle並行非同步執行儲存過程Oracle並行非同步儲存過程
- ORACLE並行相關的引數Oracle並行
- CSDN學院FAQ
- flutter基礎faqFlutter
- LLM並行訓練5-MoE並行並行
- Oracle之多行記錄變一行記錄,行變列,並排序(wmsys.wm_concat)Oracle排序
- LLM並行訓練1-流水線並行並行
- LLM並行訓練3-資料並行並行
- LLM並行訓練2-張量並行並行
- 【效能】Oracle表並行對邏輯遷移後查詢效能的影響Oracle並行
- LLM並行訓練7-混合並行總結並行
- 2020-12-19 docker 部署oracle 並plsq遠端連結oracleDockerOracle
- 12C開始oracle實現了SCALABLE LGWR多程式並行寫redo logOracle並行
- systemverilog中for/foreach並行執行並行
- WRF WPS多核並行執行並行
- oracle列轉行Oracle
- [ORACLE] SQL執行OracleSQL
- DM並行查詢並行
- Sqoop 並行抽數OOP並行
- PostgreSQL 之並行框架SQL並行框架
- 26、多執行緒與並行執行緒並行
- 對Oracle分割槽表進行表空間遷移並處理ORA-14511問題Oracle
- 雲原生網路代理 MOSN FAQ
- RSLB2 windows下使用FAQWindows
- Oracle調優之看懂Oracle執行計劃Oracle