0

我正在寫一個存儲過程,以獲取銷售報告的數據。查詢是這樣的: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%的總執行時間。

感謝您的閱讀!

回答

0

如果實際計劃失敗,可能是由於過時的統計數據造成的。

您是否嘗試過更新查詢中表格的統計信息。

如果統計數據過期,這可能導致執行計劃關閉。如果沒有更新的統計數據,您的查詢可能會非常低效。

的語法用於更新統計是:

update statistics tablename; 

嘗試更新的統計數據,看看你得到更準確的執行計劃。

+0

感謝您的回覆!我更新了所有表格的統計數據,並沒有幫助。實際執行計劃沒有改變。 – 2012-04-10 14:50:19