【问题标题】:Stored procedure performance inconsistancy存储过程性能不一致
【发布时间】:2014-04-18 03:34:10
【问题描述】:

在 SQL Server 上运行存储过程时,我们遇到了一种奇怪的情况。当使用相同的参数运行完全相同的过程时(我们已经通过 SQL Server Profiler 捕获了这一点),我们会得到非常可变的 CPU 使用率。现在显然这取决于服务器负载和服务器上正在进行的其他活动。但是,我不希望我们在随后的情况下运行 SP 时遇到“读取”的可变性 - 仅相隔几分钟。

Day  Hour Min CPU      Reads
70  15  54  4851    33079
70  15  54  5960    33723
70  15  58  5538    30189
70  16  10  5226    29672
70  16  12  24102   1019178
70  16  17  23915   1017621
70  16  17  26348   1018690
70  16  30  6443    28121
70  16  30  6474    28539
70  16  33  5242    27245
70  16  33  6365    27338
70  16  35  5413    27335

离奇。当我们以前没有然后重置自己时,为什么我们会突然获得大量读取。我要再说一次 - 我们对这个过程有完全相同的参数,所以为什么它突然决定它必须进行大量读取,这有点奇怪。

关于看什么有什么想法吗?我们知道一些额外的查询可能会带来一些好处(例如查询分析器建议一个),但我们不希望看到大致相同的读取次数吗?

谢谢 安迪

【问题讨论】:

  • 能否请您也添加程序定义?
  • 检查在读取时间上升到该stp正在使用的表之前或同时是否有任何插入。
  • 听起来可能是参数嗅探问题。
  • 恐怕不能添加过程(这是可怕的 SQL)——它基本上创建了几个 #temp 表,然后在一些内联 SQL 中使用......(不要问,我没写)。我们在世界各地的不同网站上使用它,而且只有在英国我们才遇到这个问题。它周围没有大量数据更改,但会有插入和更新,但为什么会突然导致读取量大幅上升然后再次下降?当参数发生变化时,我可以理解参数嗅探,但当它们仅相隔几分钟相同时,我就无法理解。

标签: sql sql-server performance


【解决方案1】:

您是否在其他人也在运行它的生产环境中运行它? 那么它可能是参数嗅探问题,因为执行计划是使用编译时提供的参数来编译以获得最佳性能的。

您可以尝试添加With Recompile,看看问题是否消失!

【讨论】:

  • 击败我 :) 其他选项是代替 RECOMPILE(因为它很昂贵)为每个参数声明局部变量,为它们分配参数并使用它们而不是 SP 代码中的参数。跨度>
  • 好主意,但在某些情况下,重新编译实际上可能比运行非优化版本的查询更便宜,所以两者都试试!
猜你喜欢
  • 2010-12-04
  • 1970-01-01
  • 2015-03-19
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多