溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Oracle數據庫中hash join和nested loop怎么用

發布時間:2021-12-13 15:13:24 來源:億速云 閱讀:618 作者:小新 欄目:關系型數據庫

這篇文章主要為大家展示了“Oracle數據庫中hash join和nested loop怎么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Oracle數據庫中hash join和nested loop怎么用”這篇文章吧。

Oracle 表的連接方式-----Nested loop join和 Sort merge join

  關系數據庫技術的精髓就是通過關系表進行規范化的數據存儲,并通過各種表連接技術和各種類型的索引技術來進行信息的檢索和處理。

表的三種關聯方式:

nested loop:從A表抽一條記錄,遍歷B表查找匹配記錄,然后從a表抽下一條,遍歷B表........就是一個二重循環 hash join:將A表按連接鍵計算出一個hash表,然后從B表一條條抽取記錄,計算hash值,根據hash到A表的hash來匹配符合條件的記錄 sort merge join:將A,B表都排好序,然后做merge,符合條件的選出

  對于三種連接,我們都可以使用hint來強制讓優化器走:use_hash,use_nl,use_merge.

Nested Loop Join

1.執行原理

例如:
select t1.*,t2.* from t1,t2 where t1.col1=t2.col2;
訪問機制如下:
for i in (select * from t1) loop  ----t1為驅動表
 for j in (select * from t2 where col2=i.col1) loop
 display results;
 end loop;
 end loop;
類似一個嵌套循環
嵌套循環執行時,先是外層循環進入內層循環,并在內層循環終止之后
接著執行外層循環再由外層循環進入內層循環中,當外層循環全部終止時,程序結束

2.步驟如下

a.確定驅動表
b.把inner 表分配給驅動表
c.針對驅動表的每一行,訪問被驅動表的所有行

3.執行計劃大致如下

NESTED LOOPS
outer_loop  --驅動表
inner_loop

優化器模式為FIRST_ROWS時,我們經常會發現有大量的NESTED LOOP
這時,在返回數據給用戶時,我們沒有必要緩存任何數據,這是nested loop的一大亮點

4.使用場景

 一般用在連接的表中有索引,并且索引選擇性較好(也就是Selectivity接近1)的時候
  也就是驅動表的記錄集比較?。?lt;10000)而且inner表需要有有效的訪問方法(Index)
  需要注意的是:JOIN的順序很重要,驅動表的記錄集一定要小,返回結果集的響應時間是最快的

5.和索引的關系

 嵌套循環和索引就像一對孿生兄弟,一般需要共同考量與設計,這從優化器的執行機制可以看出.
  比如,存在2張表,一個10條記錄,一個1000萬條記錄
  以小表為驅動表,則代價為:10*(通過索引在大表查詢一條記錄的代價)
  如果1000萬的大表沒有索引的時候,那么COST的代價可想而知
  因此,在多表連接時,注意被驅動表的連接字段是否需要創建索引
  或者連接字段與該表的其他約束條件字段上是否需要創建復合索引

Sort Merge Join

 1.執行原理

select t1.*,t2.* from t1,t2 where t1.id=t2.id;
訪問機制如下:
訪問t1,并order by t1_1.id,這里的id代表連接字段
訪問t2,并order by t2_1.id
join t1_1.id = t2_1.id,依次交替 比對 歸并,但無所謂驅動

2.使用場景

雖說,hash join就是用來替代sj的,但如果你的服務器的CPU資源和MEM資源都很緊張的時候,建議用SORT MERGE JOIN
因為hash join比sort merge join需要的資源更多。特別是cpu
10g sql tuning 文檔上寫道:
On the other hand, sort-merge joins can perform better than hash joins if both of the following conditions are met:
The row sources are already sorted. 
A sort operation does not have to be done.
所以,sj大概就用在沒有索引,并且數據已經排序的情況

以上是“Oracle數據庫中hash join和nested loop怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女