數(shù)據(jù)庫并行查詢是指針對查詢語句使用并行處理。當目標語句發(fā)生全表掃描、全分區(qū)掃描及索引快速全掃描的情況時,優(yōu)化器如果滿足一些前提條件下是可以選擇使用并行處理的。前提條件有:
1)會話并行查詢特性:可以在會話一級啟用或禁用并行查詢,默認情況下是啟用的。啟用、禁用命令分別如下:
此外,還可以通過下面查詢來查看當前會話是否啟用了并行查詢。
這個屬性可返回enabled、disabled、forced,分別對應(yīng)啟用、禁用和強制。其中,強制是一種特殊的狀態(tài),它會強制查詢語句指定并行度查詢,甚至會覆蓋后面講到的對象并行屬性。設(shè)置方法如下:
2)SQL語句并行提示:并行提示可以覆蓋上面會話級別的設(shè)置。一方面,即使在會話級別禁用了并行查詢,提示也可以強制執(zhí)行一個并行操作。唯一可以用來關(guān)閉并行查詢的方法是將parallel_max_servers設(shè)置為0。另一方面,即使在會話級別強制設(shè)置了一個并行度,提示還是可以改變另外一個并行度。并行提示是使用來指定的。
3)對象設(shè)置并行屬性:在SQL語句相關(guān)的對象中可設(shè)置并行屬性,也可使用并行查詢。這是在對象定義時指定的,也可以后期修改。
下面通過幾個示例,看看如何通過提示、對象屬性及強制會話來完成并行查詢。下面首先看看使用提示的方式。
下面解釋一下執(zhí)行步驟:
ID=6:掃描表的一部分,具體掃描哪個部分取決于它的父操作(即PX BLOCK ITERATOR)。
ID=5:將全表掃描分解為較小的掃描,這是一個涉及塊范圍粒度的操作。
ID=4:每個掃描匯總其count(status)的值。
ID=2、3:將每個子結(jié)果傳遞給查詢調(diào)度進程。從這個執(zhí)行計劃中,可以通過TQ字段識別出哪些操作是由一組從屬進程來執(zhí)行的。
在這個計劃中,操作3、4、5、6擁有同樣的值(Q1,00),因此它們是由同一組從屬進程執(zhí)行的(從執(zhí)行計劃中無法得知從屬進程的數(shù)量)。此外需要注意,操作3中的從屬進程與查詢調(diào)度進程(QC)之間的由并行到串行(P->S)的通信過程非常必要。
ID=1,進一步匯總這些結(jié)果,并輸出答案。
下面看看使用對象屬性的方式。
下面看看使用強制會話的方式。
還要注意一點,會話默認是啟動并行查詢的,可以將會話關(guān)閉。
通過上面的示例可見,并行查詢執(zhí)行計劃與普通的串行操作的不同。下面說明在并行操作過程中各部分之間的關(guān)系。在并行執(zhí)行的執(zhí)行計劃中會使用并行操作之間的下列關(guān)系。在dbms_xplan產(chǎn)生的輸出中,并行操作之間的關(guān)系是通過字段IN-OUT來提供的。
并行到串行(P->S):并行操作發(fā)送數(shù)據(jù)到串行操作。通常是并行進程將數(shù)據(jù)發(fā)給并行調(diào)度進程。
并行到并行(P->P):一個并行操作發(fā)送數(shù)據(jù)給另一個并行操作。當存在兩組從屬進程時就會用到它。
并行與父操作合并(PCWP):執(zhí)行計劃中的相同從屬進程并行執(zhí)行一個操作及其父操作(父操作也是并行的)。因此,沒有通信發(fā)生。
并行與子操作合并(PCWC):執(zhí)行計劃中的相同從屬進程并行執(zhí)行一個操作及其子操作(子操作也是并行的)。因此,沒有通信發(fā)生。
串行到并行(S->P):一個串行操作發(fā)送數(shù)據(jù)給并行操作。由于大部分時間這個操作的效率都較差,因此應(yīng)該避免使用它。有兩個情況會產(chǎn)生這個操作。一個是單一進程產(chǎn)生數(shù)據(jù)的速度可能沒有多個進程消費數(shù)據(jù)的速度快。如果是這樣,消費者可能花費更多的時間來等待數(shù)據(jù)而不是真正地處理數(shù)據(jù)。另一個是,串行執(zhí)行的操作和并行執(zhí)行的操作發(fā)送數(shù)據(jù)需要一些不必要的通信。
985大學 211大學 全國院校對比 專升本