2009-12-29 17 views

回答

16

NESTED LOOPS都不錯,如果循環內條件是sargable,即索引可以用來限制記錄數。

對於這樣的查詢:

SELECT * 
FROM a 
JOIN b 
ON  b.b1 = a.a1 
WHERE a.a2 = @myvar 

,與a領先,從a每個記錄將被取出,並b所有相應的記錄應該可以找到。

如果b.b1被索引並具有較高的基數,那麼NESTED LOOP將是一個首選的方法。

SQL Server,它也是執行非等值連接(在ON子句中比=條件以外的東西)

HASH JOIN是最快的方法,如果所有(或幾乎所有的)記錄應被解析的唯一途徑。

它從b獲取所有記錄,在它們上面構建一個散列表,然後從a獲取所有記錄,並使用連接列的值作爲關鍵字來查找散列表。

  • NESTED LOOPS藉此時間:

    Na * (Nb/C) * R

    其中NaNb是記錄的號碼abC是指數基數,並R對於所需的恆定時間行查詢(1SELECT,WHEREORDER BY條款中的所有字段都被索引覆蓋,約10如果他們不)

  • HASH JOIN藉此時間:

    Na + (Nb * H)

    ,其中H是建立和查找哈希表(每條記錄)的常數的總和。他們被編入引擎。

SQL Server計算用表的統計基數,計算並比較這兩個值,並選擇最好的計劃。

1

通常,它將取決於正在連接的集合的大小。

我強烈建議你閱讀 「內部的Microsoft SQL Server 2008:T-SQL查詢」,由伊茨克奔甘:

http://www.solidq.com/insidetsql/books/insidetsql2008/

(2005年版是一樣適用於這個話題,以及)

當談到充分利用您的查詢時,他會考慮您的問題以及其他許多問題。