同一存储过程的时间成本的巨大差异

时间:2012-04-27 08:09:10

标签: sql-server database sql-server-2008 stored-procedures

我使用的是SQL Server 2008 R2。

这个过程实际上是这样的:

  

首先,从远程服务器中提取 200万个记录,

     

然后在本地完成连接,

     

最终结果是数千条记录

时间成本从1分钟到30分钟不等。

在我经历了30分钟的延迟之后,似乎以下时间成本仅为3分钟左右。

相同数据,相同 SP。

什么可能导致这种巨大的差异?

更新

我删除SP,重新启动SQL服务器服务,然后重新创建SP。执行只用了50秒!

怎么了?

2 个答案:

答案 0 :(得分:2)

您描述的行为似乎极端 - 但(如果您排除客户端),有3个逻辑位置可供查看。

第一个是数据库服务器上的查询执行。值得使用查询分析器工具查看它是否使用任何索引 - 到目前为止,数据库查询的可变性能最常见的原因是查询不使用(右)索引,并且因此查询缓存的影响起了很大作用。 SQL Server将缓存大量数据,并且proc的第一次运行会填充该缓存;第二次运行更快,因为它命中缓存。过了一会儿,缓存变得陈旧,并且运行proc再次变慢。

第二种可能性是数据库服务器不稳定 - 它可能不够强大,无法完成它应该做的所有工作。在这种情况下,有一刻你很幸运,拥有自己的所有服务器资源;接下来,其他人正在运行查询,而你的查询速度变慢。这会使所有查询变慢,而不仅仅是这一个 - 因此听起来不太可能。

第三种可能性是网络怪异 - 正如菲尔所说,"成千上万的记录"没有什么可怕的,但如果他们变得很大,而你的网络已经饱含了小猫的照片,那么可能会产生影响。再次,这将表现为一般的网络缓慢,并且不太可能解释延迟30分钟...

答案 1 :(得分:0)

第四,同时发生的事情是什么?

第五,您的SP是否使用动态生成的SQL语句?这将导致SP不被预编译。如果可能的话,将这些陈述分离到子SP中。