並行概念
並行概念
並行執行(parallel execution)是Oracle企業版才有的特性(標準版中沒有這個特性),指能夠將一個大型序列任務(任何DML,或者一般的DDL)物理地劃分為多個較小的部分,這些較小的部分可以同時得到處理。
並行包括:
並行查詢:這是指能使用多個作業系統程式或執行緒來執行一個查詢。Oracle會發現能並行執行的操作(如全表掃描或大規模排序),並建立一個查詢計劃來實現)。
並行DML(PDML):這在本質上與並行查詢很相似,但是PDML主要是使用並行處理來執行修改(INSERT、UPDATE、DELETE和MERGE)。
並行DDL:並行DDL是指Oracle能並行地執行大規模的DDL操作。例如,索引重建、建立一個新索引、資料載入以及大表的重組等都可以使用並行處理。
並行恢復:這是指資料庫能並行地執行例項(甚至介質)恢復,以減少從故障恢復所需的時間。
過程並行化:這是指能並行地執行所開發的程式碼。
何時使用並行
在應用並行執行之前,需要保證以下兩點成立:
必須有一個非常大的任務,如對50GB資料進行全面掃描。
必須有足夠的可用資源(CPU、I/O、記憶體)。在並行全面掃描50GB資料之前,你要確保有足夠的空閒CPU(以容納並行程式),還要有足夠的I/O通道。
如果只有一個小任務(通常OLTP系統中執行的查詢就是這種典型的小任務),或者你的可用資源不足(這也是OLTP系統中很典型的情況),其中CPU和I/O資源通常已經得到最大限度的使用,那就根本不用考慮並行執行。
如果一個任務只需要幾秒(或更短時間)就能序列地完成,引入並行執行後,相關的管理開銷可能會讓整個過程花費更長的時間。
舉例如,寫一頁文件若12個人來寫,需要開會分段等,可能並不如一個人來寫更快。而如果寫1200頁,12個人寫需要的時間只為原來的1/12,就算分配任務可能也就1/12,還是比一個人寫要快多了。
並行查詢
並行查詢允許將一個SQL SELECT語句劃分為多個較小的查詢,每個部分的查詢併發地執行,然後會將各個部分的結果組合起來,提供最終的答案。
在並行程式和掃描檔案之間並不存在1對1對映,可以多個程式掃描同一個檔案。
各個並行程式可稱為並行執行伺服器(parallel execution server),有時也稱為並行查詢(parallel query,PQ)從屬程式。各個並行執行伺服器都是單獨的會話,就像是專業伺服器程式一樣連線資料庫。每個並行執行伺服器分別負責掃描表中一個部分(各個部分都不重疊),彙總其結果子集,將其輸出發回給協調伺服器(即原始會話的伺服器程式),它再將這些子結果彙總為最終答案。
在預設情況下,Oracle是不啟用並行查詢的。啟用並行查詢有多種方法,可以直接在查詢中使用一個提示,或者修改表要求考慮並行執行路徑等。
【並行查詢方法】
1)暗示hints式,臨時有效
select /*+parallel(table_name num)*/ count(*) from table_name;
多表關聯時多表並行:
select /*+parallel(table_name1,num1) parallel(table_name2,num2)*/ count(*) from table_name1, table_name2;
2)alter table物件式,長期有效
alter table table_name parallel num;
3)alter session會話式,會話生命週期有效
alter session force parallel query parallel num;
4)並行DDL式,會話生命週期有效
alter session enable parallel dml;
對於前兩種方式,若省略num則Oracle將自動根據負載確定並行度。並行度要隨著系統上工作負載的增減而變化。如果有充足的空閒資源,並行度會上升;如果可用資源有限,並行度則會下降。這樣就不會為機器強加一個固定的並行度。利用這種方法,允許Oracle動態地增加或減少查詢所需的併發資源量。
示例:
操作內並行使用的slave process數量就是並行度dop,index&table都有dop 作為預設操作並行度default 1表示不使用並行處理
SQL> create table t1 (a int) parallel 6;
Table created.
SQL> select degree from user_tables where table_name='T1';
DEGREE
———-
6
SQL> alter table t1 parallel 3;
Table altered.
SQL> select degree from user_tables where table_name='T1';
DEGREE
———-
3
*禁用alter table(index) parallel 1 (noprallel)
#create 時候使用parallel不僅會在建立table&index時使,後續的操作ddl,dml也會使用(如果只想建表時使用,建好後修改)
SQL> create table t2 (a int) parallel;(未指定並行度)
Table created.
SQL> select degree from user_tables where table_name='T2';
DEGREE
———-
DEFAULT
efault並行度=(cpu_count*parallel_threads_per_cpu)
SQL> show parameter cpu
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cpu_count integer 1
parallel_threads_per_cpu integer 2
resource_manager_cpu_allocation integer 1
SQL> insert into t2 values (1);
1 row created.
SQL> commit;
Commit complete.
SQL> set autotrace trace exp
SQL> select * from t2;
執行計劃
----------------------------------------------------------
Plan hash value: 1216610266
--------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 2 (0)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM)| :TQ10000 | 1 | 13 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 3 | PX BLOCK ITERATOR | | 1 | 13 | 2 (0)| 00:00:01 | Q1,00 | PCWC | |
| 4 | TABLE ACCESS FULL| T2 | 1 | 13 | 2 (0)| 00:00:01 | Q1,00 | PCWP | |
--------------------------------------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
=================補充=======================
oracle 中並行度的設定需要考慮的因素
並行執行是oracle 中一項比較重要的技術,特別是在OLAP系統中,應對長期執行資源消耗高的SQL語句。並行度的設定對於使用oracle
並行執行特性來說是一項關鍵而複雜的任務,設定的不恰當,可能反而因為使用oracle 並行執行特性而導致系統的效能下降。
oracle 中並行度的設定不僅僅是透過幾個引數的調整那麼簡單,更重要的是明確以下幾個問題。
1、伺服器的CPU核心數。
雖然現在的膝上型電腦都早已經跨入雙核的時代,更不用說是伺服器了,但是還是可能存在你的伺服器執行在單個CPU的虛擬機器上面。即使你的
伺服器有多個核心,但是把並行度設定的過高是不明智的。所有應該認真的考慮一下CPU核心數和並行度的關係。
2、訪問的資料在磁碟上面是如何組織的。
如果是儲存在單個磁碟上面,因為並行程式或者執行緒要排隊等待訪問磁碟,會削弱並行處理的優勢,如果要訪問的資料按照能夠並行訪問的方式組織
在多個磁碟裝置上面(並不是資料組織到多個磁碟就能夠並行訪問的),那麼並行的優勢將會很明顯。
3、要採用並行執行的SQL是什麼性質的。
那些長期執行或者資源密集型的SQL語句,才能夠在並行執行中獲得益處。那些短小的SQL語句並不是適合採用並行執行。因為初始化和協調多個並行
程式存在一定的開銷。所有說事務性的語句不適合採用並行執行,並行執行更多的場合是使用在OLAP系統中。
注:系統中不可能所有的SQL語句都採用並行執行,也沒有這個必要。
4、系統的負載。
即使你的系統中CPU核心數很多,IO效能也很好,也支援並行IO,記憶體也大。但是系統的負載卻可能很高,這時候如果啟用較多的並行程式,將會導致系統
整體效能的下降,因為並行執行是典型的“以資源換時間”的例子。所有采用並行執行的時候確保系統中的可用資源比較充足。
5、整體也個體的關係。
這裡需要注意一點是,並行執行的SQL語句對系統其他SQL語句效能的影響。系統中資源的總量是固定的,貌似採用虛擬化技術可以動態的調整系統中的總體資源。
但是調整需要時間,另外並是不所有的系統都採用了這種技術,更重要的前提是money。所有在系統資源總量不變的情況下,你並行執行的SQL語句消耗的資源多了
勢必其他SQL執行可用的資源就減少了,從而導致系統中其他SQL語句的執行效能下降。所以我們需要做一個tradeoff.
6、什麼樣的SQL語句可以並行的執行。
並不是所有的SQL語句的執行都可以並行執行,如果你不知道SQL語句並行執行的條件,那麼很可能導致這一的疑問,我採用了並行執行,怎麼效能沒有提高?
7、並行執行不是在做SQL最佳化。
跑出某個結果或者實施某個操作,使用並行執行只是使用更多的資源來換取較短的執行時間,並不是實施SQL的最佳化。如果採用並行執行的SQL本身有效能問題的話
那麼並行執行將會放大這一問題,影響其他SQL語句的執行。
8、請先測試。
為了確保並行執行能夠滿足你的需求,請先進行測試。
並行執行(parallel execution)是Oracle企業版才有的特性(標準版中沒有這個特性),指能夠將一個大型序列任務(任何DML,或者一般的DDL)物理地劃分為多個較小的部分,這些較小的部分可以同時得到處理。
並行包括:
並行查詢:這是指能使用多個作業系統程式或執行緒來執行一個查詢。Oracle會發現能並行執行的操作(如全表掃描或大規模排序),並建立一個查詢計劃來實現)。
並行DML(PDML):這在本質上與並行查詢很相似,但是PDML主要是使用並行處理來執行修改(INSERT、UPDATE、DELETE和MERGE)。
並行DDL:並行DDL是指Oracle能並行地執行大規模的DDL操作。例如,索引重建、建立一個新索引、資料載入以及大表的重組等都可以使用並行處理。
並行恢復:這是指資料庫能並行地執行例項(甚至介質)恢復,以減少從故障恢復所需的時間。
過程並行化:這是指能並行地執行所開發的程式碼。
何時使用並行
在應用並行執行之前,需要保證以下兩點成立:
必須有一個非常大的任務,如對50GB資料進行全面掃描。
必須有足夠的可用資源(CPU、I/O、記憶體)。在並行全面掃描50GB資料之前,你要確保有足夠的空閒CPU(以容納並行程式),還要有足夠的I/O通道。
如果只有一個小任務(通常OLTP系統中執行的查詢就是這種典型的小任務),或者你的可用資源不足(這也是OLTP系統中很典型的情況),其中CPU和I/O資源通常已經得到最大限度的使用,那就根本不用考慮並行執行。
如果一個任務只需要幾秒(或更短時間)就能序列地完成,引入並行執行後,相關的管理開銷可能會讓整個過程花費更長的時間。
舉例如,寫一頁文件若12個人來寫,需要開會分段等,可能並不如一個人來寫更快。而如果寫1200頁,12個人寫需要的時間只為原來的1/12,就算分配任務可能也就1/12,還是比一個人寫要快多了。
並行查詢
並行查詢允許將一個SQL SELECT語句劃分為多個較小的查詢,每個部分的查詢併發地執行,然後會將各個部分的結果組合起來,提供最終的答案。
在並行程式和掃描檔案之間並不存在1對1對映,可以多個程式掃描同一個檔案。
各個並行程式可稱為並行執行伺服器(parallel execution server),有時也稱為並行查詢(parallel query,PQ)從屬程式。各個並行執行伺服器都是單獨的會話,就像是專業伺服器程式一樣連線資料庫。每個並行執行伺服器分別負責掃描表中一個部分(各個部分都不重疊),彙總其結果子集,將其輸出發回給協調伺服器(即原始會話的伺服器程式),它再將這些子結果彙總為最終答案。
在預設情況下,Oracle是不啟用並行查詢的。啟用並行查詢有多種方法,可以直接在查詢中使用一個提示,或者修改表要求考慮並行執行路徑等。
【並行查詢方法】
1)暗示hints式,臨時有效
select /*+parallel(table_name num)*/ count(*) from table_name;
多表關聯時多表並行:
select /*+parallel(table_name1,num1) parallel(table_name2,num2)*/ count(*) from table_name1, table_name2;
2)alter table物件式,長期有效
alter table table_name parallel num;
3)alter session會話式,會話生命週期有效
alter session force parallel query parallel num;
4)並行DDL式,會話生命週期有效
alter session enable parallel dml;
對於前兩種方式,若省略num則Oracle將自動根據負載確定並行度。並行度要隨著系統上工作負載的增減而變化。如果有充足的空閒資源,並行度會上升;如果可用資源有限,並行度則會下降。這樣就不會為機器強加一個固定的並行度。利用這種方法,允許Oracle動態地增加或減少查詢所需的併發資源量。
示例:
操作內並行使用的slave process數量就是並行度dop,index&table都有dop 作為預設操作並行度default 1表示不使用並行處理
SQL> create table t1 (a int) parallel 6;
Table created.
SQL> select degree from user_tables where table_name='T1';
DEGREE
———-
6
SQL> alter table t1 parallel 3;
Table altered.
SQL> select degree from user_tables where table_name='T1';
DEGREE
———-
3
*禁用alter table(index) parallel 1 (noprallel)
#create 時候使用parallel不僅會在建立table&index時使,後續的操作ddl,dml也會使用(如果只想建表時使用,建好後修改)
SQL> create table t2 (a int) parallel;(未指定並行度)
Table created.
SQL> select degree from user_tables where table_name='T2';
DEGREE
———-
DEFAULT
efault並行度=(cpu_count*parallel_threads_per_cpu)
SQL> show parameter cpu
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cpu_count integer 1
parallel_threads_per_cpu integer 2
resource_manager_cpu_allocation integer 1
SQL> insert into t2 values (1);
1 row created.
SQL> commit;
Commit complete.
SQL> set autotrace trace exp
SQL> select * from t2;
執行計劃
----------------------------------------------------------
Plan hash value: 1216610266
--------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 2 (0)| 00:00:01 | | | |
| 1 | PX COORDINATOR | | | | | | | | |
| 2 | PX SEND QC (RANDOM)| :TQ10000 | 1 | 13 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) |
| 3 | PX BLOCK ITERATOR | | 1 | 13 | 2 (0)| 00:00:01 | Q1,00 | PCWC | |
| 4 | TABLE ACCESS FULL| T2 | 1 | 13 | 2 (0)| 00:00:01 | Q1,00 | PCWP | |
--------------------------------------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement (level=2)
=================補充=======================
oracle 中並行度的設定需要考慮的因素
並行執行是oracle 中一項比較重要的技術,特別是在OLAP系統中,應對長期執行資源消耗高的SQL語句。並行度的設定對於使用oracle
並行執行特性來說是一項關鍵而複雜的任務,設定的不恰當,可能反而因為使用oracle 並行執行特性而導致系統的效能下降。
oracle 中並行度的設定不僅僅是透過幾個引數的調整那麼簡單,更重要的是明確以下幾個問題。
1、伺服器的CPU核心數。
雖然現在的膝上型電腦都早已經跨入雙核的時代,更不用說是伺服器了,但是還是可能存在你的伺服器執行在單個CPU的虛擬機器上面。即使你的
伺服器有多個核心,但是把並行度設定的過高是不明智的。所有應該認真的考慮一下CPU核心數和並行度的關係。
2、訪問的資料在磁碟上面是如何組織的。
如果是儲存在單個磁碟上面,因為並行程式或者執行緒要排隊等待訪問磁碟,會削弱並行處理的優勢,如果要訪問的資料按照能夠並行訪問的方式組織
在多個磁碟裝置上面(並不是資料組織到多個磁碟就能夠並行訪問的),那麼並行的優勢將會很明顯。
3、要採用並行執行的SQL是什麼性質的。
那些長期執行或者資源密集型的SQL語句,才能夠在並行執行中獲得益處。那些短小的SQL語句並不是適合採用並行執行。因為初始化和協調多個並行
程式存在一定的開銷。所有說事務性的語句不適合採用並行執行,並行執行更多的場合是使用在OLAP系統中。
注:系統中不可能所有的SQL語句都採用並行執行,也沒有這個必要。
4、系統的負載。
即使你的系統中CPU核心數很多,IO效能也很好,也支援並行IO,記憶體也大。但是系統的負載卻可能很高,這時候如果啟用較多的並行程式,將會導致系統
整體效能的下降,因為並行執行是典型的“以資源換時間”的例子。所有采用並行執行的時候確保系統中的可用資源比較充足。
5、整體也個體的關係。
這裡需要注意一點是,並行執行的SQL語句對系統其他SQL語句效能的影響。系統中資源的總量是固定的,貌似採用虛擬化技術可以動態的調整系統中的總體資源。
但是調整需要時間,另外並是不所有的系統都採用了這種技術,更重要的前提是money。所有在系統資源總量不變的情況下,你並行執行的SQL語句消耗的資源多了
勢必其他SQL執行可用的資源就減少了,從而導致系統中其他SQL語句的執行效能下降。所以我們需要做一個tradeoff.
6、什麼樣的SQL語句可以並行的執行。
並不是所有的SQL語句的執行都可以並行執行,如果你不知道SQL語句並行執行的條件,那麼很可能導致這一的疑問,我採用了並行執行,怎麼效能沒有提高?
7、並行執行不是在做SQL最佳化。
跑出某個結果或者實施某個操作,使用並行執行只是使用更多的資源來換取較短的執行時間,並不是實施SQL的最佳化。如果採用並行執行的SQL本身有效能問題的話
那麼並行執行將會放大這一問題,影響其他SQL語句的執行。
8、請先測試。
為了確保並行執行能夠滿足你的需求,請先進行測試。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31397003/viewspace-2139797/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 執行緒,程式,協程, 併發,並行,同步,非同步概念解析執行緒並行非同步
- parallel並行度的相關操作、概念、引數解釋Parallel並行
- Oracle並行操作——並行DML操作Oracle並行
- 並行並行
- 並行執行並行
- Oracle並行操作——從序列到並行Oracle並行
- Oracle並行操作——並行查詢(Parallel Query)Oracle並行Parallel
- LLM並行訓練5-MoE並行並行
- C#並行程式設計-相關概念C#並行行程程式設計
- 並行(Parallel)並行Parallel
- 【概念】行連結和行遷移的概念、模擬及甄別
- LLM並行訓練1-流水線並行並行
- LLM並行訓練2-張量並行並行
- LLM並行訓練3-資料並行並行
- 並查集的概念與演算法實現並查集演算法
- JavaScript單執行緒概念JavaScript執行緒
- A/B 測試:概念 ≠ 執行
- 多執行緒的概念執行緒
- 執行緒基本概念執行緒
- 執行緒概念淺談執行緒
- Oracle並行操作——淺議使用並行的時機Oracle並行
- LLM並行訓練7-混合並行總結並行
- Oracle並行FAQOracle並行
- Oracle的並行Oracle並行
- 並行的威力並行
- 並行謬論並行
- 【JUC】2-一把“鎖”兩個“並”三個“程”(JAVA多執行緒相關概念)Java執行緒
- 並行查詢並行度Degree與instances 設定並行
- OpenMP並行化例項----Mandelbrot集合並行化計算並行
- 多執行緒基本概念執行緒
- 執行緒的基本概念執行緒
- DM並行查詢並行
- oracle的並行世界Oracle並行
- PostgreSQL 之並行框架SQL並行框架
- Oracle中的並行Oracle並行
- GDAL並行I/O並行
- SQL中並行操作SQL並行
- 並行的代價並行