场景:我们有一个简单的选择查询
Declare P@
SELECT TOP(1) USERID
FROM table
WHERE non_clusteredindex_column = (@P) ORDER BY PK_column DESC
自 1 年以来,它通常在 0.12 秒内执行。但昨天午夜过后,它突然开始消耗我所有的 CPU 并需要 150 秒才能执行。我检查了 SP_who2 并没有发现死锁,除了这个消耗所有 CPU 的查询之外什么也没有。我决定重新启动服务器以消除任何参数嗅探问题或终止任何陈旧的连接。在重新启动服务器以进行未来根本原因分析之前,我进行了 SLQ 分析器跟踪 1 分钟。重启后,一切恢复正常。我很惊讶并好奇地开始查看我采用的分析器中的执行计划,并将其与 SAME 查询的当前执行计划进行比较。我发现两者都不一样。
问题之夜前的执行计划与重启后的执行计划相同。(做完美的索引寻求)
但是有问题的 Night SQL 分析器中的执行计划正在执行完整的索引扫描,这会占用所有 CPU 并需要 150 秒才能执行。
问题:
我可以说执行计划突然重新编译或查询在昨天午夜之后开始使用新的执行计划(完全扫描),在我重新启动后,它再次开始使用旧的和良好的执行计划(索引搜索)。
Q1。是什么让 SQL server 突然使用新的 EXECUTION 计划? Q2。是什么让 SQL Server 在重新启动后使用旧的和好的执行计划? 第三季度。当我传递参数时,任何与参数嗅探相关的东西。但从技术上讲,它不应该像参数列那样组织良好,数据分布均匀。