天天看點

oracle 表連接配接圖解,圖解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進行研究。

如圖所示的例子:

oracle 表連接配接圖解,圖解Oracle表連接配接優化之嵌套循環連接配接(Nested loops join)

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

oracle 表連接配接圖解,圖解Oracle表連接配接優化之嵌套循環連接配接(Nested loops join)

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

請看下面的示例:

oracle 表連接配接圖解,圖解Oracle表連接配接優化之嵌套循環連接配接(Nested loops join)

對比下面的例子:

oracle 表連接配接圖解,圖解Oracle表連接配接優化之嵌套循環連接配接(Nested loops join)

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

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

oracle 表連接配接圖解,圖解Oracle表連接配接優化之嵌套循環連接配接(Nested loops join)

請注意以下問題:

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

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

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

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