[英]SQL Server - wrong execution plan?
我有一個很大的表,里面有很多行和很多列(我知道這很糟糕,但是我們不理會它)。
具體來說,我有兩列FinishTime, JobId
。 第一個是該行的結束時間,第二個是其ID(不是唯一的,但幾乎是唯一的-只有很少的記錄具有相同的ID)。
我的Jobid索引和完成時間索引。
我們一直在插入行,主要是按結束時間排序。 我們還會定期更新每個索引的統計信息。
現在解決問題:
當我運行帶有篩選器jobid==<some id> AND finishtime > <now minus 1 hour>
查詢時-該查詢花費大量時間,並且在顯示估計的執行計划時,我看到該計划將超過finishtime
索引,即使遍歷jobid
索引也應該好得多。 查看索引統計信息時,我發現服務器“認為”最近一小時的作業數為1,因為我們沒有更新該索引的統計信息。
當我運行帶有篩選器jobid==<some id> AND finishtime > <now minus 100 days>
-這很有用,因為SQL Server知道要遍歷正確的索引-作業ID索引。
因此,基本上,我的問題是,為什么如果我們不一直更新索引統計信息(這很耗時),那么服務器會假設最后一個存儲桶之后的記錄數為1?
非常感謝
您可以使用DBCC SHOW_STATISTICS獲得有關索引包含的統計數據的直方圖,例如
DBCC SHOW_STATISTICS ( mytablename , myindexname )
對於基於日期的記錄,查詢總是容易出現錯誤的統計信息。 運行此命令應顯示直方圖中的最后一個存儲桶幾乎沒有[早/今天/后]范圍內的任何記錄。 但是,在其他所有條件都相同的情況下,如果SQL Server都是不包含列的finishtime
索引,則SQL Server仍應首選job_id
索引而不是finishtime
索引。 這是因為job_id(int)的查找速度比finishtime(datetime)快。
注意:如果您的finishtime
被覆蓋的查詢,這會嚴重影響查詢優化器,因為它消除書簽查找操作選擇它。
為了解決這個問題,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.