通過雜湊聯接進行高階優化

iSQlServer發表於2008-12-22

雜湊聯接有兩種輸入:生成輸入和探測輸入。查詢優化器指派這些角色,使兩個輸入中較小的那個作為生成輸入。

雜湊聯接用於多種設定匹配操作:內部聯接;左外部聯接、右外部聯接和完全外部聯接;左半聯接和右半聯接;交集;並集和差異。此外,雜湊聯接的某種變形可以進行重複刪除和分組,例如 SUM(salary) GROUP BY department。這些修改對生成和探測角色只使用一個輸入。

以下幾節介紹了不同型別的雜湊聯接:記憶體中的雜湊聯接、Grace 雜湊聯接和遞迴雜湊聯接。

 記憶體中的雜湊聯接
雜湊聯接先掃描或計算整個生成輸入,然後在記憶體中生成雜湊表。根據計算得出的雜湊鍵的雜湊值,將每行插入雜湊儲存桶。如果整個生成輸入小於可用記憶體,則可以將所有行都插入雜湊表中。生成階段之後是探測階段。一次一行地對整個探測輸入進行掃描或計算,併為每個探測行計算雜湊鍵的值,掃描相應的雜湊儲存桶並生成匹配項。

 Grace 雜湊聯接
如果生成輸入大於記憶體,雜湊聯接將分為幾步進行。這稱為“Grace 雜湊聯接”。每一步都分為生成階段和探測階段。首先,消耗整個生成和探測輸入並將其分割槽(使用雜湊鍵上的雜湊函式)為多個檔案。對雜湊鍵使用雜湊函式可以保證任意兩個聯接記錄一定位於相同的檔案對中。因此,聯接兩個大輸入的任務簡化為相同任務的多個較小的例項。然後將雜湊聯接應用於每對分割槽檔案。

 遞迴雜湊聯接
如果生成輸入非常大,以至於標準外部合併的輸入需要多個合併級別,則需要多個分割槽步驟和多個分割槽級別。如果只有某些分割槽較大,則只需對那些分割槽使用附加的分割槽步驟。為了使所有分割槽步驟儘可能快,將使用大的非同步 I/O 操作以便單個執行緒就能使多個磁碟驅動器繁忙工作。

注意:
如果生成輸入僅稍大於可用記憶體,則記憶體中的雜湊聯接和 Grace 雜湊聯接的元素將結合在一個步驟中,生成混合雜湊聯接。
 


在優化過程中不能始終確定使用哪種雜湊聯接。因此,SQL Server 開始時使用記憶體中的雜湊聯接,然後根據生成輸入的大小逐漸轉換到 Grace 雜湊聯接和遞迴雜湊聯接。

如果優化器錯誤地預計兩個輸入中哪個較小並由此確定哪個作為生成輸入,生成角色和探測角色將動態反轉。雜湊聯接確保使用較小的溢位檔案作為生成輸入。這一技術稱為“角色反轉”。至少一個檔案溢位到磁碟後,雜湊聯接中才會發生角色反轉。

注意:
角色反轉的發生獨立於任何查詢提示或結構。角色反轉不會顯示在查詢計劃中;角色反轉對於使用者是透明的。
 


 雜湊援助
術語“雜湊援助”有時用於描述 Grace 雜湊聯接或遞迴雜湊聯接。

注意:
遞迴雜湊聯接或雜湊援助會導致伺服器效能降低。如果跟蹤中顯示許多雜湊警告事件,請更新正在聯接的列上的統計資訊。
 


 

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

相關文章