我正在寫一個存儲過程,以獲取銷售報告的數據。查詢是這樣的:SQL執行計劃 - 預計計劃似乎比實際計劃更準確
INSERT INTO @FirstQuery
SELECT t1.*, t2.*
FROM t1
LEFT JOIN t2 ON t1.idT1 = t2.idT1
LEFT JOIN t3 ON t3.idT2 = t2.idT2
WHERE t1.nonIndexedField = @parameter1
AND (t2.idT2 IS NULL
OR
(@parameter2 = 'XXX' AND t1.indexedField1 = @parameter3)
OR
(@parameter2 = 'YYY' AND t3.indexedField1 = @parameter3)
)
有了這些成績,我然後填寫第二個表變量:
INSERT INTO @SecondQuery
SELECT u1.*, u2.*
FROM u1
INNER JOIN u2 ON u2.idU1 = u1.idU1
WHERE u1.NONindexedField in (SELECT someField FROM @FirstQuery)
由於這是正對QA環境很慢,我看了執行計劃。首先我看看了預計計劃。它發現SecondQuery需要很長時間,我意識到u1.NONindexedField沒有索引,估計佔總成本的97%。 但後來我看了一下實際計劃,它說FirstQuery的總收入是100%。我檢查了在估計計劃上計算出的估計行數,並且它估計了很多行,實際計劃顯示的行數很少(100K)。我認爲這是因爲缺少索引的字段在一個沒有太多行(17K)的表中,但我仍然創建了索引。令我驚訝的是,查詢時間從500秒減少到15秒。 所以,我的問題是......爲什麼這樣的執行計劃差異,以及實際計劃如何實現?我知道估計的計劃並不是真的意味着「對計劃的估計」,而是「估計行數」的計劃,但這並不能解釋這種差異,並且不能解釋爲什麼實際計劃告訴我所有人成本是在一個查詢,不需要優化...
順便說一句,我比較相對時間和第二個查詢確實需要大約97%的總執行時間。
感謝您的閱讀!
感謝您的回覆!我更新了所有表格的統計數據,並沒有幫助。實際執行計劃沒有改變。 – 2012-04-10 14:50:19