(轉)執行計劃相關概念

buptdream發表於2009-01-15

    驅動表(driving table)和被探查表(probed table)的概念

驅動表又稱為外層表(outer table),這個概念用於巢狀與hash連線中,如果驅動表row source返回較多的行資料,則對所有的後續操作都有負面的影響,因為將大的row source作為驅動表時在後續的操作中返回的中間結果都比較大。這是比較容易理解的。

另外在驅動表的選擇上,應該選擇經限制條件選擇之後結果集比較小的row source作為驅動表,而不是單純選擇原始資料較小的資料表作為driving table

驅動表的識別,在執行計劃那個,靠上的那個row source應該是驅動表,一般都是在from關鍵字後靠前位置的表。

    表之間的連線

目前為止,無論連線操作符如何,典型的連線型別有三種:

排序――合併連線(sort merge joinSMJ))

內部連線過程為:1,先生成驅動資料,然後對這些資料按照連線操作關聯列進行排序;2,生成被探查資料,然後對這些資料按照連線操作關聯列進行排序;3,對已經排序的兩個結果放在一起執行合併操作。

排序是一個費時、費資源的操作,特別對於大表。基於這個原因,SMJ經常不是一個特別有效的連線方法,但是如果2row source都已經預先排序,則這種連線方法的效率也是比較高的。

優點:1,對於非等值連線,效果較高,2,如果關聯列上都有索引,效果更好;3,如果兩個row source都比較大,本方法要稍好於NL4,如果返回的row source過大則又會導致過多的IO

巢狀迴圈(Nested loops NL

內部連線過程,是對驅動資料來源的每一行資料去遍歷被探查資料來源。

一個習慣性的指導原則是利用較小的資料來源作為驅動資料來源,因為遵循這種原則時nl連線查詢往往需要較少的IO次數,但也不盡然,有時又可能得到相反的結果,所以在判斷時需要根據查詢統計結果中實際執行的IO次數來判斷該選擇那個資料來源作為驅動資料來源。

習慣原則:如果驅動資料來源較小,並且在被探查資料來源上有唯一索引,或者有高選擇性的非唯一索引時,使用這種方法可以得到較好的效率。

另外,NL連線方法的一個優點是:可以返回已經連線的行,而不必等待所有的連線操作處理完成之後才返回資料,這可以實現快速的響應時間。

優點:如果驅動資料來源比較小,而且被探查資料來源有唯一索引或者高選擇性的非唯一索引,這種方法可以得到較好的效果;2,可以返回已經連線的行而不必等待所有的連線操作處理完才返回資料。

雜湊連線(Hash JoinHJ

這種連線從理論上說比NLSMJ更有效,而且只能在CBO優化器中。

較小的row source被用來構建hash tablebitmap,第二個row source被用來被hashed,並與第一個row source生成的hash table進行匹配,以便進行進一步的連線。Bitmap被用來作為一種比較快的查詢方法,來檢查在hash table中是否有匹配的行。

hash table比較大而不能全部容納在記憶體中時,這種方法特別有用,而當hash joinbitmap可以被容納在記憶體中時這

種連線方式的效率極高。

需要設定hash_join_enabled=truehash_area_size引數以使得hash連線高效執行。

優點:在兩個較大的row source之間連線時會取得較好的效率,在一個row source較小時會取得更好的效率;2,只能用於等值連線。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10701850/viewspace-539653/,如需轉載,請註明出處,否則將追究法律責任。

相關文章