簡體   English   中英

SQL Server-錯誤的執行計划?

[英]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被覆蓋的查詢,這會嚴重影響查詢優化器,因為它消除書簽查找操作選擇它。

為了解決這個問題,

  1. 定期更新統計信息
  2. 在數據上創建多個過濾索引(2008+功能),其中一個分區的更新末端要定期更新
  3. 在敏感查詢上使用索引提示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM