瞭解巢狀迴圈聯接、合併聯接

iSQlServer發表於2008-12-22

巢狀迴圈聯接

巢狀迴圈聯接也稱為“巢狀迭代”,它將一個聯接輸入用作外部輸入表(顯示為圖形執行計劃中的頂端輸入),將另一個聯接輸入用作內部(底端)輸入表。外部迴圈逐行處理外部輸入表。內部迴圈會針對每個外部行執行,在內部輸入表中搜尋匹配行。

最簡單的情況是,搜尋時掃描整個表或索引;這稱為“單純巢狀迴圈聯接”。如果搜尋時使用索引,則稱為“索引巢狀迴圈聯接”。如果將索引生成為查詢計劃的一部分(並在查詢完成後立即將索引破壞),則稱為“臨時索引巢狀迴圈聯接”。查詢優化器考慮了所有這些不同情況。

如果外部輸入較小而內部輸入較大且預先建立了索引,則巢狀迴圈聯接尤其有效。在許多小事務中(如那些隻影響較小的一組行的事務),索引巢狀迴圈聯接優於合併聯接和雜湊聯接。但在大型查詢中,巢狀迴圈聯接通常不是最佳選擇。

瞭解合併聯接

合併聯接要求兩個輸入都在合併列上排序,而合併列由聯接謂詞的等效 (ON) 子句定義。通常,查詢優化器掃描索引(如果在適當的一組列上存在索引),或在合併聯接的下面放一個排序運算子。在極少數情況下,雖然可能有多個等效子句,但只用其中一些可用的等效子句獲得合併列。

由於每個輸入都已排序,因此 Merge Join 運算子將從每個輸入獲取一行並將其進行比較。例如,對於內聯接操作,如果行相等則返回。如果行不相等,則廢棄值較小的行並從該輸入獲得另一行。這一過程將重複進行,直到處理完所有的行為止。

合併聯接操作可以是常規操作,也可以是多對多操作。多對多合併聯接使用臨時表儲存行。如果每個輸入中有重複值,則在處理其中一個輸入中的每個重複項時,另一個輸入必須重繞到重複項的開始位置。

如果存在駐留謂詞,則所有滿足合併謂詞的行都將對該駐留謂詞取值,而只返回那些滿足該駐留謂詞的行。

合併聯接本身的速度很快,但如果需要排序操作,選擇合併聯接就會非常費時。然而,如果資料量很大且能夠從現有 B 樹索引中獲得預排序的所需資料,則合併聯接通常是最快的可用聯接演算法。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-520804/,如需轉載,請註明出處,否則將追究法律責任。

相關文章