並行概念

不一樣的天空w發表於2017-05-24
並行概念

並行執行(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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章