當一條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提示?