SQL Server:实时查询统计信息显示快速存储的过程时间,但返回结果需要将近一分钟

时间:2018-03-01 21:23:03

标签: sql-server sql-server-2016

我有一个可变快速和慢速的存储过程。我阅读了有关参数嗅探和查询计划的内容,并一直在分析查询计划中的哪些差异可能导致这种差异。

我意识到,它似乎不是一个优化问题,参数嗅探问题。我已经使用估计的执行计划,实际执行计划和实时查询统计来比较各种情况下的计划。虽然SMSS中的返回时间从亚秒到几乎一分钟不等,但有一点是不变的 - 所有执行计划和实时查询统计信息都表明查询是/应该/快。实时查询统计信息在最近一次运行时显示0.074秒,但结果需要52秒才能返回。

流程如下:

  • 我从启用了实时查询统计信息的SMSS执行存储过程
  • 连续一秒钟产生执行计划
  • 显示计划,然后状态栏显示"执行查询... 0%"
  • 旋转下一个X秒,其中X在5到52之间
  • 然后blip,结果弹出,实时查询统计计划立即填写绿色选择节点上规定的执行时间在0.074s到~2s之间

有时同一查询的重复运行速度很快(这让我觉得,哦,它从缓存中加载计划并且能够更快地执行,但后来我把OPTION(RECOMPILE)放在了结尾处。我读过的存储过程强制它不使用计划缓存),但有时需要同样长的存储过程。有时,当我更改输入值时,它会更快,有时也不会。再一次,一个常数 - 计划/统计数据认为它应该是/很快。

存储过程本身并不复杂,一个select语句在一个相当小的数据集上使用窗口进行聚合,另外一些连接到其他小表 - 在我的测试中返回的最大行数约为90数据集。所有关键列都有索引。

我真的不认为它实际上是查询本身的性能问题,无论计划中的差异如何,我已经看到了一些细微的变化,具体取决于传入的参数,执行时间估计和实时查询统计数据一致告诉我 - 它很快,有时候实时查询统计数据甚至不会在节点下显示任何时间。

在某些时候用不同的参数一遍又一遍地运行它似乎很快就会回来,但只有一段时间。然后,通常只是在我感觉到的那一刻,"无论那是什么,现在似乎都很好,继续......" BAM回到Slowsville。

1 个答案:

答案 0 :(得分:0)

如果没有更多信息,这很难诊断。但是,听起来你可能会发生参数嗅探。

https://www.brentozar.com/archive/2013/06/the-elephant-and-the-mouse-or-parameter-sniffing-in-sql-server/