關于SQL表連接的hash join,merge join ,nested loop join三種優化器選擇方式--個人理解
比如兩個表,A表和B表(均有id,name列) select * from a,b where a.id=b.id ;
1、hash join 哈希連接 大表和大表,小表和大表
分為連個階段:1、構建哈希表階段 2、探測匹配階段
A表id: B表id:
3 7
4 3
2 5
5 4
1 6
簡化理解如下,深層次的并不是這么簡單
第一階段構建哈希表階段
將A表的id批量讀入,計算哈希值,形成記憶體中的哈希表,如果表較大,則將表分為多個分片,Oracle中用bucket桶的概念來存放不同的哈希磁區或叫分片,分批讀取
第二階段探測階段,B表中的每一行id,使用hash函式的運算,將其與A表中的哈希值做探測匹配,入果表較大,則一次和多個分片或者桶中的A表哈希值做探測匹配。
2、sort merge join 排序合并連接 有排序操作的,如order by,group by ,distinct等對結果有排序的
一般用于等連接,自然連接
A表id: B表id:
3 7
4 3
2 5
5 4
1 6
----先對兩個表中資料排序
A表id: B表id:
1 3
2 4
3 5
4 6
5 7
A表的id和B表的id順序匹配1(3)無,2(3)無,3(3)=3匹配,4(4)=匹配 5(5)=匹配
開銷一般為A+B記錄總和
如果有物化視圖,和索引,這種連接的效率也會有很大提升,如果排序的資料量較大,會在pg系統中產生臨時的temporary file快取,Oracle中用的是temporary 臨時表空間
3、nested loop 嵌套回圈連接
A表id: B表id:
3 7
4 3
2 5
5 4
1 6
使用A表中每一個id去匹配B表全表id 3(7,3,5,4,6)=3 4(7,3,5,4,6)=4 2(7,3,5,4,6)=無
開銷計算cost=A表記錄資料*B表記錄數
適用于小表,或者存在物化視圖,表上有索引的join
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/7137.html
標籤:PostgreSQL
