SQL Join 的三種類型


1、Hash Match Join

Hash運算(即散列算法) 和Hash表。

Hash運算是一種編程技術,用來把數據轉換為符號形式,使數據可以更容易更快速地被檢索。例如,表中的一行數據,可以通過程序轉化為一個唯一的值,這個值就代表了這行數據的內容。這和數據加密很類似,一個hash值同樣也可以被轉換回原始數據。

Hash表是一個數據結構,它把所有的元素都切分成同等大小的“類”或“塊”,允許對這些元素的快速訪問。hash函數決定了元素應該進入哪個“塊”。例如,你可以從表里取出一行數據,將其轉換為hash值,然后將hash值存入hash表。

Hash Match Join 發生時,Sql Server連接一大一小兩張表,對小表里的數據行進行hash運算,將生成的hash值插入到hash表里,然后遍歷大表里的數據,每次取出一行在hash表里尋找匹配的行。對小表進行hash運算是為了降低hash表的大小,hash值可以進行快速的比較。如果兩張表都很大,那么hash match jion和其他類型的join比起來就非常低效。

Hash Match Join對大數據集尤其是其中一個表比另外的一個小很多的時候效率很高。對表沒有按照join列排序或者表中沒有可用索引的情況,hash match join也是很有效的方式。

Hash Match Join的出現也可能意味着存在更高效的連接方式(Nested Loop或Merge),這可能是以下原因造成的:
  1.索引缺失或者索引不正確
  2.where語句缺失
  3.where語句里有對索引列的計算或轉換使得索引失效
在這些情況下,優化器認為Hash Match Join是連接兩張表的最高效的方式,但是有可能可以通過增加索引、或者增加where語句來減少數據量等方式獲得更高效的查詢。

 

2、Nested Loop Join

顧名思義,Nested Loop Join這個操作使用嵌套雙層循環,在我們這個計划里下邊這個(17%那個)運算符的結果在外層。由於兩個數據集都很小,所以這是個很高效的操作。只要內層數據集小,外層數據集(小不小不要緊)有索引的情況下,Nested Loop Join是一種非常高效的連接機制。除非數據集超大,這種連接方式應該是你最希望看到的連接方式。

 

3、Merge Join

使用Merge Join連接的兩張表必須是按照連接列預先排序好了的,這中情況下Merge Join是一種高效的連接方式。如果連接的表沒有按照連接列預先排序的話,查詢優化器要么先排序再執行Merge Join, 或者執行效率稍低些的Hash Match Join。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM