表連線概念(轉)

333111444發表於2009-03-03

表連線概念

Hash join
它的連線方式﹐Oracle將第一個表加載入記憶體﹐使用一種Hash 朮﹐連線第二個表. 顯然驅動表應該選擇兩者中的較小者。 因為CBO總是傾向於把HASH連線放在次要地位﹐我們可以用
USE_HASH
提示﹐強制最佳化器使用HASH連線方式。由於HASH 法的使用﹐索引的存在對效能的影響不是很大。

Nested loop
即巢狀迴圈連線﹐是一種是最基本的表連線方式﹐在巢狀迴圈 中﹐首先從驅動表讀取記錄﹐然後把結果集與第二個表進行比較 連線﹐如圖所示,這一切都是透過索引來進行的﹐如果沒有索引﹐ 連線成本會大大地增加。 在考慮連線順序時﹐應該把最小的表作為驅動表。 在內部表上建有可用的索引的時候﹐應該首先考慮使用Nested Loop

[@more@]


Sort merge join 它不使用索引﹐它用全表掃描獲得兩個資料集合﹐然後將它們 分別排序後﹐合併成為一個最終的結果集。 注意到排序合併連線中並沒有使用索引是非常重要的。在大多數 情況下﹐透過索引訪問更快一些﹐但是當連線表中需要有大量資料 的處理和返回﹐大量的全表掃描﹐或者表上沒有建立索引的話﹐可 以考慮使用Sort merge join

*
表連線最佳化例項
曾經在一個ERP維護中遇到過這樣一個典型問題﹐有一個比較 複雜的SQL﹐其中由多個關聯了十幾個大表的檢視JOIN而成﹐噝?一次花幾個小時的時間。後來經過仔細觀察執行計劃﹐發現最佳化器 在處理上述的幾個大的結果集關聯的時候﹐使用的是巢狀迴圈。眾 所周知﹐巢狀迴圈需要用到索引﹐否則效率會很低﹐而幾個資料集 關聯時是不可能有索引的﹐噝屑競

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

相關文章