SQL Server存储过程中首次运行缓慢

4
我有一个存储过程,每天晚上十二点后运行九次。虽然不是理想的存储过程,但你知道情况总是这样的。没有哪个计划可以经得起现实的考验。
通常情况下,这个存储过程需要大约一分钟的时间才能运行,处理数据的数量也会影响所需时间。然而,在每天第一次运行时,它有时需要花费异常长的时间,甚至比通常所需时间长数倍(有时甚至无法完成)。如果我强制停止它并重新启动,它会正常运行。
我正在寻找一个优雅的解决方案——至少比我最初的想法更加优雅,即增加一个额外的运行步骤,该步骤不生成我使用的数据,并且可以容忍其失败。
有人见过这种情况吗?你是如何解决的?

你是否使用任何动态SQL或非可搜索参数? - Matthew
2
缓存的存储过程执行计划会在一夜之间丢失的原因是什么? - Rup
1
@Rup:一个统计更新。 - gbn
如果您能将正常运行时间减少一半或更多,这仍然是一个问题吗?为什么需要2分钟才能解决这个问题? - Shan Plourde
5个回答

5

很可能是编译时间和冷数据缓存(缓冲池)。如果通常需要一分钟的时间,那么我猜它应该相当庞大。

编译时间:在统计信息更新时,执行计划将无效。如果您有批量处理或隔夜维护,则可能会遇到此问题

冷缓存:数据/索引页面必须从磁盘读入内存。

为了减轻这些问题:

  • 进行虚拟运行(如注释所述)
  • 更快的IO或更多的RAM
  • 计划指南

我们有相同的问题,特别是在开发环境中,有时我们的网站会超时。我们只需再次点击即可...


1
最终,我通过更新存储过程以使用动态搜索条件来解决了这个问题。(http://www.sommarskog.se/dyn-search-2005.html是经典指南)这个改变将处理时间降低到所有运行的次秒执行,无论是第一次还是其他情况。 - quillbreaker
@quillbreaker:很好,你有结果了。那个网站无论如何都值得一读。 - gbn
1
第一次运行花费的时间太长了,除非他们用一个绘图计算器替换了我们的SQL Server硬件,否则这不仅仅是编译问题。 - quillbreaker

2
为了提供解决方案,首先要做的就是调查原因。可能有许多问题会表现为您所描述的症状。在解决性能问题时,始终应遵循一种调查方法,例如Waits And Queues。这将揭示过程为什么在第一次运行时缓慢的原因。可能的罪魁祸首:
  • 冷高速缓存
  • 与另一个进程存在某些资源(锁定?)的争用
  • 参数嗅探导致错误的计划
根据您发现的问题,将有适当的解决方案。
你不应该盲目更改设置并希望问题消失,而从未理解出了什么问题。

2
每天第一次运行proc时,还会发生什么?它可能被其他进程(备份、统计更新、其他定时作业)锁定吗?

1

在SQL Server中,存储过程被缓存在内存中。

如果您使用DBCC FREEPROCCACHE命令,则会重新编译SQL语句。

如果您的服务器正在重新启动(例如每晚或每周),可能会清除其缓存,这将导致查询在第一次尝试时运行缓慢。

您可以通过运行上述命令并运行查询来测试是否发生了相同的情况...如果是,我会说您的缓存正在被清除。


1

数据库的AUTO_UPDATE_STATISTICS或AUTO_UPDATE_STATISTICS_ASYNC是否开启?可能是因为第一次运行时注意到需要更新统计信息并进行了更新。在前者设置选项中,它会等待统计信息更新完成;而在后者中,它不会等待统计信息更新,但可能会选择一个次优的计划,从而导致性能下降。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接