我有一個基本查詢,從6秒到1秒,只需將一個連接從LEFT JOIN
更改爲LEFT HASH JOIN
或'左循環連接'即可。任何人都可以解釋爲什麼這會導致性能如此之大的增加,以及爲什麼SQL的優化器不能自行找出它?爲什麼'HASH JOIN'或'LOOP JOIN'改善了這個存儲過程?
這裏大致是SQL的樣子:
SELECT
a.[ID]
FROM
[TableA] a
LEFT HASH JOIN
[TableB] b
ON b.[ID] = a.[TableB_ID]
JOIN
[TableC] c
ON c.[ID] = a.[TableC_ID]
WHERE
a.[SomeDate] IS NULL AND
a.[SomeStatus] IN ('X', 'Y', 'Z') AND
c.[SomethingElse] = 'ABC'
表A和B具有數以百萬計的記錄和索引的所有ID字段。使用SQL Server 2005.
編輯:一個同事提出了一個左循環加入,它似乎使它更快...... SQL不是我的優勢之一,所以我想了解這些「提示」正在幫助。
您可以在應用提示之前發佈計劃嗎?只需發出'SET SHOWPLAN_TEXT ON GO SELECT ...' – Quassnoi 2009-09-08 18:43:30
刪除所有提示,然後在顯示實際計劃中在SSMS中運行查詢,然後在計劃中將預計行數與掃描/查找操作符的實際行數進行比較計劃。該計劃基於*估計*計數生成,持續時間由*實際*計數驅動。差異表示不好的統計數據,但也可能發生不尋常的奇數值的良好統計數據(例如,恰好有1密耳行數不爲10的SomeStatus)。 – 2009-09-08 18:54:49