缺少存储过程的执行计划


12

存储过程的缓存中缺少计划的原因是什么?

  1. WITH RECOMPILE
  2. 动态SQL
  3. 加密代码
  4. 重大数据更改
  5. 更新统计
  6. 还有什么?

我最近在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(可能导致数百万行),一些更新和删除。因此,大量数据更改到临时表。百万。


当您存储了可以再现该问题的proc时,您是否可以创建一个可以再现该问题的最小示例,从而找出问题所在?
马丁·史密斯

Answers:


3

有两种计划缓存DMF:

sys.dm_exec_query_plan-以XML格式返回缓存的计划,但最多只能达到一定的大小(并且只要它们可以在SQL Server中格式化为XML即可,这意味着最多128个嵌套级别。)

sys.dm_exec_text_query_plan-以文本格式返回任何大小的缓存计划。但是缺点是,当计划很大时,您将无法在SQL Server中将它们转换为XML,甚至TRY_CONVERT也是XML会返回null的原因。

sp_BlitzCache只打了以前的DMV(因为它需要分析查询计划为XML才能进行各种切片和切块。)我提出了Github问题#838来改进此问题,因此我们至少可以提醒用户检查sys.dm_exec_text_query_plan更大的查询。但是,我们仍然无法对其进行XML分析。


同样的原因sys.query_store_plan.query_plannvarchar(MAX),而不是XML(SQL琐事)。
Remus Rusanu

@RemusRusanu ooo,那么大的计划在那里出现!真好
布伦特·奥扎尔

我们正在检查缺少的计划是否是由于您找到的东西造成的。收到回复后,我将发布更新。
塔拉·凯泽

即使没有收到客户的回覆,我也将其标记为答案。这是唯一剩下的事情,鉴于大量查询,这是有道理的。如果有任何更改,我将发布更新。
塔拉·凯泽

@TaraKizer您之所以这样做是因为即将进行季度审核,对吧?我看你在那做什么。奖金已解锁。
布伦特·奥扎尔

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.