存储过程的缓存中缺少计划的原因是什么?
WITH RECOMPILE
- 动态SQL
- 加密代码
- 重大数据更改
- 更新统计
- 还有什么?
我最近在2台服务器(SQL Server 2008 R2和SQL Server 2012)上工作,这些服务器在缓存中没有计划用于非常占用资源的存储过程。存储过程中的许多(也许是全部)语句在缓存中也没有计划。一些存储过程非常频繁地执行,例如每秒执行几次。
没有任何记忆压力。其中一台服务器的硬件远远超出了所需。
我认为丢失的计划是由于在存储过程中间创建了临时表,但这似乎是来自SQL Server 2000或更早版本的旧信息。从SQL Server 2005开始,重新编译在DDL之后的语句的语句级别进行。在所有情况下都是如此吗,还是在新版本中仍然会发生?
遗失计划的罪魁祸首是什么?我已经浏览了有关该主题的几篇文章,但似乎没有什么合适的选择。
我本周要查看的服务器上启用了针对临时工作负载的优化。其中一个存储过程每天仅执行一次。我确实有那个的代码。我没有每分钟执行100次以上的代码,但我可以理解。我将无法发布代码,但是我可以根据自己的问题进行描述。
我不相信任何人都可以释放过程高速缓存或删除干净的缓冲区。该客户正在使用Solarwinds DPA作为其监视工具之一。DPA确实在每天被调用的存储过程中捕获了该语句的执行计划之一。由于不可保留的WHERE
子句,该语句具有大量读取。如果DPA捕获了该语句,则它是一个估计的计划,并且一次在计划缓存中。当我们进行故障排除时,只是不存在。我将让他们开始记录sp_WhoIsActive
到表中。
我正在使用sp_BlitzCache
。(我为Brent Ozar Unlimited工作)将显示整个存储过程的计划以及单个语句(如果存在)的计划。如果它们不存在,则会发出警告“我们找不到该查询的计划。可能的原因包括动态SQL,RECOMPILE
提示和加密代码。” 声明上也有警告。
TF 2371未安装。我正在查看等待统计信息。服务器很无聊。PLE超过130,000。
我现在有另外2个存储过程的代码。其中之一是使用动态SQL,exec (@sql)
这样我们就知道为什么没有针对它的计划。但是另一种(每分钟运行100次以上)没有任何异常。唯一突出的一点是,临时表是在超过1000行代码的中间创建的。它也确实调用了一堆子存储过程。
关于SQL Server 2008中的计划缓存,我没有看到任何> = 8k的文字,但是其中一个存储过程在调用另一个存储过程之前就对批量插入发表了评论。但是批量插入没有出现在我正在查看的外部存储过程中。本文的“重新编译阈值”部分很有趣。我看到的临时表是大量的INSERT(可能导致数百万行),一些更新和删除。因此,大量数据更改到临时表。百万。