共計 1932 個字符,預計需要花費 5 分鐘才能閱讀完成。
這篇文章主要為大家展示了“Oracle 數據庫中 hash join 和 nested loop 怎么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓丸趣 TV 小編帶領大家一起研究并學習一下“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)的時候
也就是驅動表的記錄集比較?。?0000)而且 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 怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!
正文完