舉一個簡單的例子來說明SQL Server 中hash join的演算法.例如有兩張表, 每張表都有10000行的記錄, 假設做join的兩個欄位都是從1到10000的序數.如果要做hashjoin, 那麼首先對其中的一個表上的列進行hash運算, 將生成相同值的列放在一個桶裡.為了簡單起見, 假定這裡的hash運算就是模100, 那麼這些行經過hash運算後, 會生成100組資料,也就是100個桶. 每個桶中都是100條除100後餘數相同的記錄.然後對另一個表中的join列做相同的hash運算, 根據得到的餘數,放入對應的桶裡.於是得到的結果就是100個hash桶中, 每個桶中都有200條記錄, 分別來自兩個表.然後在桶內,再做nested loop join, 這樣一個桶中最多做100*100次的比對, 100個桶最多做1,000,000次的比對.而如果一開始就用nested loop join, 則最多需要做10000*10000次, 也就是100,000,000次. 兩種演算法就比對的次數來說,相差了100倍, 差異是很明顯的.另外在多cpu的伺服器上, hashjoin可以並行的執行,而nestedloop join 通常只能序列的執行,這就使執行時間的差異更加明顯.
舉一個簡單的例子來說明SQL Server 中hash join的演算法.例如有兩張表, 每張表都有10000行的記錄, 假設做join的兩個欄位都是從1到10000的序數.如果要做hashjoin, 那麼首先對其中的一個表上的列進行hash運算, 將生成相同值的列放在一個桶裡.為了簡單起見, 假定這裡的hash運算就是模100, 那麼這些行經過hash運算後, 會生成100組資料,也就是100個桶. 每個桶中都是100條除100後餘數相同的記錄.然後對另一個表中的join列做相同的hash運算, 根據得到的餘數,放入對應的桶裡.於是得到的結果就是100個hash桶中, 每個桶中都有200條記錄, 分別來自兩個表.然後在桶內,再做nested loop join, 這樣一個桶中最多做100*100次的比對, 100個桶最多做1,000,000次的比對.而如果一開始就用nested loop join, 則最多需要做10000*10000次, 也就是100,000,000次. 兩種演算法就比對的次數來說,相差了100倍, 差異是很明顯的.另外在多cpu的伺服器上, hashjoin可以並行的執行,而nestedloop join 通常只能序列的執行,這就使執行時間的差異更加明顯.