Sql-Server

配置索引時查詢需要很長時間才能執行

  • September 3, 2020

我們有一個包含 190M 記錄的表。在一個相當獨特的列上有一個索引,但是,如果我在選擇前 10 名的表上執行查詢,其中只有 where 和 select 子句中的索引列,它仍然需要很長時間才能完成。

如果我打開實時查詢計劃 sql server 會顯示“等待查詢計劃”等待微調器。如果查詢最終完成,如果我再次執行它,它會立即完成。即使我之前執行 DBCC FREEPROCCACHE 所以感覺就像創建查詢計劃一直在佔用,但是我無法通過在查詢之前執行 DBCC FREEPROCCACHE 來重現。一段時間後,同樣的問題將再次發生。

在此處輸入圖像描述

注意:數據庫有 2 個文件組。索引和系統數據庫儲存在 SSD 磁碟上,而普通表數據儲存在非 SSD 磁碟上。

在這種情況下,也許自動更新統計數據AUTO_UPDATE_STATISTICS_ASYNC ON是你的朋友。檢查索引統計日期以查看它是否與緩慢一致:

SELECT 
   STATS_DATE(
         OBJECT_ID(N'YourSchema.YourTable')
       , INDEXPROPERTY(OBJECT_ID(N'YourSchema.YourTable'),N'YourIndexName','IndexID')
   ) AS LastStatsDate;

——丹古茲曼

如果它不是計劃生成(SET STATISTICS TIME ON可以揭示),或者查詢處理本身(僅讀取具有非常獨特索引的幾行),那麼自然會懷疑是阻塞。- tibor-karaszi


有幾種方法可以監視統計更新事件(分析器、擴展事件……)。SQL Server 2019引入WAIT_ON_SYNC_STATISTICS_REFRESH等待類型,它可以出現在“實際”執行計劃的等待資訊部分。

Sentry One Plan Explorer擷取統計資訊建構和刷新 (statman) 並將此資訊包含在等待資訊中。

引用自:https://dba.stackexchange.com/questions/274750