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