1. 程式人生 > >圖解Oracle 表連線優化之巢狀迴圈連線(Nested loops join)

圖解Oracle 表連線優化之巢狀迴圈連線(Nested loops join)

當一條SQL語句引用多張表連線時,Oracle的查詢優化器(Optimizer)不僅要確定每張表的訪問路徑,而且需要確定這些表的連線順序和連線方法。查詢優化器的目標是通過儘早地過濾不需要的資料,減少需要處理的資料量。

Oracle的SQL優化器(Optimizer)在執行多表連線查詢時,通常採用的連線演算法有以下幾種方式:
1、巢狀迴圈連線(NESTED LOOPS JOIN)
2、群集連線     (CLUSTER JOIN)
3、排序合併連線(SORT MERGE JOIN)
4、笛卡爾連線   (CARTESIAN JOIN)
5、雜湊連線(HASH JOIN)
6、索引連線(INDEX JOIN)


這六種連線方式都有其獨特的技術特點,在一定的條件下,可以充分發揮高效的效能;但是也都有其侷限性,如果使用不當,不僅不能提高效率,反而會嚴重影響系統的效能。

下面首先對第一種連線:NESTED LOOPS JOIN進行研究。

如圖所示的例子:


請和下圖進行仔細對比,然後理解註解部分的說明,

(此圖已經更新)


這是兩張資料表進行連線時的情況。如果是三張資料表進行連線呢?

請看下面的示例:


對比下面的例子:


我們在PL SQL Developer 8.1中執行上面的語句,並且獲取執行計劃。請注意,在執行的SQL語句中,沒有增加hints提示,為什麼會出現nested loops join和hash join兩種不同的表連線方式呢?請思考一下。

這主要是取決於Oracle查詢優化器Optimizer的預設設定。如下面的圖示說明:


請注意以下問題:

1、Optimizer採用nested loops join時與什麼條件相關?

2、在nested loops join中,通常如何選擇驅動表與被驅動表?

3、nested loops join的優化目標是什麼?

4、如果需要讓執行計劃能夠採用nested loops join進行表的連線,需要使用什麼樣的hints提示?

如果你能夠順利回答上述問題,恭喜你,你已經理解了NESTED LOOPS JOIN。