我正在使用 SQL Server 2008 R2。
过程其实是这样的:
首先,从远程服务器中提取大约200 万条记录,
然后在本地完成连接,
最终结果是数千条记录。
时间成本从不到 1 分钟到 30 分钟不等。
而在我经历了 30 分钟的延迟之后,接下来的时间成本似乎都只有 3 分钟左右。
它是相同的数据,相同的SP。
什么会导致这种巨大的差异?
更新
我删除SP,重新启动SQL server服务,重新创建SP。执行只用了50秒!
怎么了?
我正在使用 SQL Server 2008 R2。
过程其实是这样的:
首先,从远程服务器中提取大约200 万条记录,
然后在本地完成连接,
最终结果是数千条记录。
时间成本从不到 1 分钟到 30 分钟不等。
而在我经历了 30 分钟的延迟之后,接下来的时间成本似乎都只有 3 分钟左右。
它是相同的数据,相同的SP。
什么会导致这种巨大的差异?
我删除SP,重新启动SQL server服务,重新创建SP。执行只用了50秒!
怎么了?
您描述的行为似乎很极端 - 但是(如果您排除客户端),有 3 个合乎逻辑的地方可以查看。
首先是数据库服务器上的查询执行。值得使用查询分析器工具来查看它是否使用任何索引 - 到目前为止,数据库查询性能可变的最常见原因是查询没有使用(正确的)索引,因此查询缓存的影响发挥了作用很大一部分。SQL Server 将缓存大量数据,并且您的 proc 的第一次运行会填充该缓存;第二次运行速度更快,因为它会命中缓存。一段时间后,缓存变得陈旧,运行过程再次变慢。
第二种可能性是数据库服务器不稳定——它可能不够强大,无法完成它应该完成的所有工作。在那种情况下,有一天你很幸运,拥有所有的服务器资源;接下来,其他人正在运行查询,而您的查询速度变慢。这会使所有查询变慢,而不仅仅是这个——所以听起来不太可能。
第三种可能性是网络怪异——正如菲尔所说,“数千条记录”并没有什么可怕的,但如果它们很大,并且你的网络中充斥着小猫的照片,它可能会产生影响。同样,这将表现为一般的网络缓慢,并且不太可能解释 30 分钟的延迟......
第四,有什么事情同时发生吗?
五、你的SP是否使用动态生成的SQL语句?这将导致 SP 无法预编译。如果可能的话,将这些语句分成子 SP。