间歇性SQL Server超时和存储过程的执行时间差异很大

时间:2009-10-07 16:12:14

标签: sql-server sql-server-2005 timeout

我的SQL Server 2005存在问题,其中存储过程,特别是运行批量插入的过程,有时需要很长时间才能执行。这个存储过程,我们称之为DatabaseUpdate,大约需要2秒才能完成。但是,在20-40%的时间内,它需要的时间远远超过30%,30秒后它会超时。

这有点奇怪的是我有一个非常受控制的环境。我目前正在查看的日志显示了定期发生完全相同事件的时间段。有少数客户端,他们都根据计时器发出请求,这些机器都运行原子钟同步应用程序。所以我几乎可以肯定地说,每五分钟发生一次相同的事件序列,但是我的存储过程将100Kb文件导入到数据库中的执行时间从1.5-30 +秒不等。

之前我没有注意到的,因为我只看到超时错误,每隔一次更新执行时间越长,所以时间看起来像这样:

2062 2062 ms 10:35 24250 ms 10:21 1921 ms 10:45 25703毫秒 10:34 1734 ms 10:55 25406 ms 11:00 1625 ms

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

根据Mitch的建议,我还建议您通过运行SQL跟踪来验证您的问题,以验证每次调用存储过程时是否使用了相同的“Actual”而非“Estimated”执行计划。

此外,验证每次执行/ BULK INSERT正在处理相同或相似数量的记录,因为过程插入的记录越多,执行所需的时间就越长。

您是否认为您的数据库可能没有足够的大小来支持您的插入?例如,您的数据库数据文件是否需要增长以适应所有其他过程执行?

如果这些元素在每次执行之间是相同的,那么唯一要改变的其他元素就是数据库数据本身,因此需要调查统计信息和索引使用情况。

答案 1 :(得分:1)

查看您是否有任何日志增长或数据库增长事件。当数据库大小不正确时,它们将自动增长。在自动增长事件期间(可能在批量插入期间发生),数据库将冻结,直到文件增长并初始化为0。此操作持续很长时间(数十秒),并且随着数据库增长而变得越来越长,因为默认的自动增长是从大小开始的百分比,因此自动增长会变得更大。

要检查自动增长事件,请查看ERRORLOG并查看SQL Server:Database/Log Growth效果计数器值。

如果您有数据库增长事件,则必须将数据库大小设置为正确的大小。正确的值取决于您的实际数据负载。您还应该打开NTFS初始化初始化,请参阅Instant Initialization - What, Why and How?。您无法将此设置用于日志文件。

答案 2 :(得分:1)

可能是[b]锁定问题吗? SQL Profiler显示什么(也可以打开错误和死锁)?哪些资源(挂)插入等待?

答案 3 :(得分:0)

查看检查站。

我在加载大量数据时也看到了同样的事情。

问题是数据库引擎正在将脏页从内存写入磁盘。

使用Perfmon监控磁盘性能,如果是这种情况,您会在性能下降的同时看到磁盘使用量激增。