通常,SQL查詢優化器在嵌套循環和散列連接之間做出決定。什麼使SQL查詢優化器在嵌套循環和散列連接之間做出決定
7
A
回答
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
,其中
Na
和Nb
是記錄的號碼a
和b
,C
是指數基數,並R
對於所需的恆定時間行查詢(1
是SELECT
,WHERE
和ORDER 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年版是一樣適用於這個話題,以及)
當談到充分利用您的查詢時,他會考慮您的問題以及其他許多問題。
相關問題
- 1. SQL嵌套查詢優化
- 2. 查詢優化的Java - 使用查詢嵌套循環
- 3. SQL Server 2008中嵌套循環連接和散列連接的區別
- 4. 優化嵌套循環
- 5. 來優化嵌套循環
- 6. 嵌套循環優化
- 7. Coldfusion優化嵌套循環
- 8. 優化嵌套循環
- 9. 優化嵌套for循環
- 10. CUDA優化:嵌套循環
- 11. 嵌套循環優化
- 12. 優化SQL查詢連接
- 13. 在定向非循環圖中優化連接查詢
- 14. SQL Natural連接和嵌套SELECT查詢
- 15. 循環中的連接查詢和使用IN子句連接查詢之間的區別是什麼?
- 16. 如何在php中優化mysql嵌套循環查詢
- 17. 優化SQL組由和連接查詢
- 18. SQL留下嵌套查詢優化
- 19. 使用LINQ優化嵌套循環
- 20. 嵌套連接的優化
- 21. 如何使用嵌套連接優化此mysql查詢?
- 22. 在嵌套C++循環優化乘數
- 23. Mysql嵌套查詢優化
- 24. 優化嵌套Select查詢
- 25. 優化嵌套查詢
- 26. PHP - 用SQL查詢嵌套while循環
- 27. 優化一個循環的sql查詢
- 28. 如何使用JOINS和嵌套SELECT來優化此SQL查詢?
- 29. 優化嵌套查詢單查詢
- 30. 使用嵌套選擇優化查詢