【发布时间】:2019-07-27 14:38:01
【问题描述】:
场景:我们有一个简单的选择查询
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 查询的当前执行计划进行比较。我发现两者都不一样。
问题之夜前的执行计划与重启后的执行计划相同。 (做完美的索引搜索)
但有问题的夜间 SQL 分析器中的执行计划正在执行完整索引扫描,这会占用所有 CPU 并需要 150 秒才能执行。
问题:
我可以说执行计划在昨天午夜之后突然重新编译或查询开始使用新的执行计划(完整扫描),在我重新启动后,它再次开始使用旧的和良好的执行计划(索引搜索)。
第一季度。是什么让 SQL server 突然使用新的 EXECUTION 计划? 第二季度。是什么让 SQL Server 在重新启动后使用旧的和好的执行计划? 第三季度。当我传递参数时,任何与参数嗅探相关的东西。但从技术上讲,它不应该是因为参数列组织良好,数据分布均匀。
【问题讨论】:
-
当查询使用较差的执行计划时,同时加载(插入/更新)大量数据是什么?
-
另外,还有其他任务正在运行吗?这个时间点听起来很可疑,午夜运行什么家务任务?
-
没有发生异常加载(插入/删除),当然时间听起来很可疑。但是没有房子保持任务运行。即使我们有任何管家任务,这将如何影响查询以选择新的和错误的执行计划?,我只想知道“SQL 服务器是否有可能重新编译并为相同的旧执行计划使用新的执行计划?突然查询?如果是,为什么?”
-
是的,它可能会自己重新编译,但会被某些东西触发。出于某些原因,请参阅mssqltips.com/sqlservertip/5308/… 这很可能是参数嗅探问题,可能是由错误或缺失的统计数据引起的,这就是为什么我想知道可能正在进行哪些内务管理任务。服务器重新启动,更新某些查询或刷新计划缓存,诸如此类。
-
这是否意味着,SQL Restart 将刷新计划缓存?这是否意味着 SQl 服务器需要在每次重启时重新编译所有查询的所有计划?
标签: sql sql-server sql-server-2008 sql-execution-plan query-planner