随着时间的推移性能降低
这是我的第一篇文章,所以如果你需要澄清任何东西,然后让我知道。随着时间的推移性能降低
我的服务器的详细信息如下: - 的Windows 2008数据中心版
SQL 2008标准版(10.0.1600)
12GB拉姆
四核单处理器的机器
问题
我有一个运行的存储过程,当我刚启动SQL时,大约需要1/10秒才能运行。经过一段时间后,运行相同的查询需要大约3秒的时间。
我原本以为是引起问题的索引,但是如果我制作精确的副本并运行复制的版本,那么该查询现在只需要1/10秒,而原始的仍然需要3秒。
我现在假设它是与正在缓存的sproc的执行计划有关,并且当sproc再次运行时,它正在搞乱执行计划。
事情我至今
我目前有每隔15分钟重新索引的小桌子和执行出于某种原因,时间运行在我的存储过程的维护计划回落到正常水平,但随后尝试时代突然再次回升。
创建了一个sproc副本来测试它,并且一个在1/10秒运行,而原始的仍然需要很长时间。
运行“更新统计信息”sproc以确保所有统计信息都是最新的。
Ran SQL查询分析器查看是否对应该在表上的其他索引提出了任何建议,最终提出了一些建议,将索引和db大小增加到70gb以上,并且性能增加可以忽略不计。
其他信息需要注意
的DB是传播防空火炮在同一例如,两个DBS,一个包含产品信息,另一个包含客户信息。
其中一个连接表是1.3亿行。
的DB是升级从2005年至2008年
这似乎是参数嗅探给我。
您的15分钟重新索引(您是否需要!?)将导致依赖过程被重新编译。有时候会发生这种情况,在下一次执行时传递的参数值在一般情况下是次优的。您可以使用OPTIMIZE FOR来防止发生这种情况。
我每15分钟执行一次重新索引,以便查询再次正常执行。一旦小的重新指数发生,它们又会下降到1/10秒?这是什么让我相信这是执行计划或某种参数缓存 – 2010-09-27 12:58:21
@Chris - 我会消除重新索引并使用'OPTIMIZE FOR UNKNOWN'提示。 – 2010-09-27 13:00:21
感谢马丁,我打算继续努力,看看我是否看到任何性能提升。或者说,没有退化。 – 2010-09-27 13:16:27
这看起来像是由参数嗅探引起的。这里是一个很好的解释:
SQL Garbage Collector: Parameter Sniffing & Stored Procedures Execution Plan
我已经有很多参数已经存在,并且查询的形状实际上并不会因不同的参数而改变。查询中的参数是日期,客户ID,类别ID等。我将在稍后进一步研究该文章。 – 2010-09-27 12:54:56
@Chris - 这不关于查询的形状。例如,问题在于,如果程序编译时使用的参数异常选择,则可能会得到一个不同的计划,其索引搜索和书签查找对于选择性较小的情况不是最佳选择。 – 2010-09-27 12:55:57
是什么存储的过程吗?我们能看到一些简短的逻辑代码吗? – 2010-09-27 12:51:04