我試圖調試一個相當複雜的存儲過程,跨多個表(10-11)加入。我看到,對於樹的一部分,估計的行數與實際的行數有很大的不同 - 在最差的SQL服務器上,估計返回1行,實際返回55,000行!SQL Server如何計算估計的行數?
我在努力解決這是爲什麼 - 我所有的統計數據都是最新的,而且我已經用幾個表上的FULLSCAN更新了統計數據。我沒有使用任何用戶定義的函數或表變量。據我所見,SQL服務器應該能夠精確地估計將要返回的行數,但是它會繼續選擇一個計劃來執行成千上萬的RDI查找(當它期望只執行1或2)。
我能做些什麼來嘗試和理解爲什麼估計的行數超出了這麼多?
UPDATE:所以在看這個計劃我發現一個節點尤其這似乎suspicous - 使用下面的predecate表上的表掃描:
status <> 5
AND [type] = 1
OR [type] = 2
這個謂詞返回整個表(630行 - 表掃描本身並不是性能不佳的原因),但是SQL服務器的估計行數只有37個。然後,SQL服務器繼續執行多個嵌套循環,並將其轉換爲RDI查找,索引掃描和索引尋找。這可能是我大量失算的根源嗎?我如何得到它來估計更合理的行數?
請問您是否可以發佈您的表定義和完整查詢? – Quassnoi
對不起,但不是真的 - 太大了(250線SP + 10表)。 – Justin
如果您的謂詞完全如此(無括號),那麼您可能有邏輯問題。 AND優先於OR。 應該是[status] <> 5 AND(type = 1 OR type = 2) – GilaMonster