首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 效能調優實戰筆記 (二):統計資料過期導致索引失效與全表掃描

     編輯:關於SqlServer

大表 TB_CWB (30~40 萬筆) 上已建立 fn_Clt_Datetime 非叢集索引,查詢日期區間卻走叢集索引掃描 (全表掃描),耗時 12 秒。

執行計畫現象

執行計畫顯示叢集索引掃描

  • 最佳化器估算回傳資料列佔表總量比例過高,判定「掃描叢集索引比鍵查閱更便宜」。
  • 實際資料分佈可能集中於近期,統計資料未反映最新分佈。

根因與對策

  1. 統計資料過期:執行 UPDATE STATISTICS TB_CWB fn_Clt_Datetime WITH FULLSCAN 或啟用 AUTO_UPDATE_STATISTICS。
  2. 篩選索引:若查詢固定篩選 AVAILABLE = 'Y',建立 CREATE INDEX idx_CltDate_Avail ON TB_CWB(fn_Clt_Datetime) WHERE AVAILABLE = 'Y',縮小索引體積並提升選擇性估算準確度。
  3. 強制索引提示:WITH (INDEX(idx_CltDate_Avail)) 臨時繞過最佳化器(生產環境慎用)。
  4. 參數化查詢 + RECOMPILE:避免舊計畫被不當參數值綁定。

驗證結果

  • 更新統計資料後,同查詢改走索引查找 + 鍵查閱,耗時降至 < 200ms。
  • 篩選索引進一步將 IO 減半。

結語

索引存在 ≠ 索引被使用。統計資料鮮度、查詢選擇性估算、最佳化器成本模型三者互動決定最終計畫。定期維護統計資料、善用篩選索引、監控計畫變更,是防止索引失效的三板斧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved