我们有一个包含 190M 记录的表。在一个相当独特的列上有一个索引,但是,如果我在选择前 10 名的表上运行查询,其中只有 where 和 select 子句中的索引列,它仍然需要很长时间才能完成。
如果我打开实时查询计划 sql server 会显示“等待查询计划”等待微调器。如果查询最终完成,如果我再次运行它,它会立即完成。即使我之前运行 DBCC FREEPROCCACHE 所以感觉就像创建查询计划一直在占用,但是我无法通过在查询之前运行 DBCC FREEPROCCACHE 来重现。一段时间后,同样的问题将再次发生。
注意:数据库有 2 个文件组。索引和系统数据库存储在 SSD 磁盘上,而普通表数据存储在非 SSD 磁盘上。
在这种情况下,也许自动更新统计数据
AUTO_UPDATE_STATISTICS_ASYNC ON
是你的朋友。检查索引统计日期以查看它是否与缓慢一致:——丹古兹曼
如果它不是计划生成(
SET STATISTICS TIME ON
可以揭示),或者查询处理本身(仅读取具有非常独特索引的几行),那么自然会怀疑是阻塞。- tibor-karaszi有几种方法可以监视统计更新事件(分析器、扩展事件......)。SQL Server 2019引入了
WAIT_ON_SYNC_STATISTICS_REFRESH
等待类型,它可以出现在“实际”执行计划的等待信息部分。Sentry One Plan Explorer捕获统计信息构建和刷新 (statman) 并将此信息包含在等待信息中。