这是我的第一篇文章,所以如果您需要澄清任何事情,请告诉我。
我的服务器详细信息如下:-
Windows 2008 数据中心版
SQL 2008 标准版 (10.0.1600)
12GB 内存
四核单处理器机
问题
我有一个运行的存储过程,当我刚刚启动 SQL 时,运行大约需要 1/10 秒。一段时间后,运行相同的查询大约需要 3 秒。
我最初认为是索引导致了问题,但如果我制作 sproc 的精确副本并运行该复制版本,那么该查询现在只需要 1/10 秒,而原始查询仍然需要 3 秒。
我现在假设这与被缓存的 sproc 的执行计划有关,当 sproc 再次运行时,它会搞乱执行计划。
到目前为止我尝试过的事情
我目前有一个每 15 分钟运行一次的维护计划,它重新索引一个小表,出于某种原因,我的 sproc 上的执行时间回落到正常水平,但随后时间突然又恢复了。
创建了 sproc 的副本来测试它,该副本以 1/10 秒的速度运行,而原始副本仍然需要很长时间。
运行“更新统计数据”sproc 以确保所有统计数据都是最新的。
运行 SQL 查询分析器以查看它是否对应该在表上的其他索引提出任何建议,它最终提出了一些建议,将我的索引和数据库大小增加到 70GB 以上,并且性能提升可以忽略不计。
其他需要注意的信息
该数据库分布在同一个实例中的两个数据库中,一个包含产品信息,另一个包含客户信息。
其中一个连接表的长度为 1.3 亿行。
db 是从 2005 年到 2008 年的升级。
最佳答案
这对我来说似乎是参数嗅探。
您 15 分钟的重新索引(您需要吗!?)将导致重新编译依赖过程。有时,当这种情况发生时,下一次执行时传递的参数值对于一般情况来说是次优的。您可以使用 OPTIMIZE FOR 来防止这种情况发生。
关于sql - Sproc 性能会随着时间的推移而降低,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3803900/