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