進階查詢微調概念

Microsoft SQL Server 使用記憶體中排序及雜湊聯結技術來執行排序、交叉、聯集和差異等作業。使用這類查詢計畫,SQL Server 可支援資料表垂直分割 (有時候稱為分欄儲存)。

SQL Server 採用三種聯結作業:

  • 巢狀迴圈聯結

  • 合併聯結

  • 雜湊聯結

如果一個聯結輸入相當小 (少於 10 個資料列),但另一個聯結輸入相當大而且在聯結資料行建有索引的話,索引巢狀迴圈是最快速的聯結作業,因為它們需要的 I/O 最少,需要的比較也最少。如需巢狀迴圈的詳細資訊,請參閱<認識巢狀迴圈聯結>。

如果兩個聯結輸入都不小,而且依聯結資料行排序 (例如,是由掃描排序的索引所取得) 的話,合併聯結就是最快速的聯結作業。如果兩個聯結輸入都相當大,而且兩個輸入的大小類似,先行排序再進行的合併聯結所提供的效能大致類似雜湊聯結。然而,如果兩個輸入的大小差異極大的話,雜湊聯結作業多半快得多。如需詳細資訊,請參閱<認識合併聯結>。

雜湊聯結可以有效率地處理大型、未排序、無索引的輸入。它們在做為複雜查詢的中繼結果方面很有用,因為:

  • 中繼結果沒有索引 (除非明確地儲存到磁碟,然後建立索引),而且通常產生時也不會做適當的排序供查詢計畫的下一個作業使用。

  • 查詢最佳化工具只估計中繼結果的大小。因為複雜查詢的估計值可能非常不準確,所以處理中繼結果的演算法不僅必須要有效率,而且萬一中繼結果顯著大於預期時,它的效能還不得惡化得太明顯。

雜湊聯結允許少使用反正規化。反正規化一般是利用減少聯結作業,來達成較佳的效能,但它會有備援性的危險,例如不一致的更新。雜湊聯結降低了反正規化的需要。雜湊聯結讓垂直分割 (以不同的檔案或索引來呈現一個資料表中的資料行群組) 可以成為實體資料庫設計可實行的選項。如需詳細資訊,請參閱<瞭解雜湊聯結>。