sql - Sproc 性能会随着时间的推移而降低

标签 sql sql-server tsql

这是我的第一篇文章,所以如果您需要任何说明,请告诉我。

我的服务器详细信息如下:- 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/

相关文章:

sql - 循环遍历存储过程结果以创建字符串

sql-server - SQL Server 条件选择取决于输入参数

sql - String_Split 表的值

java - 如何从 java 程序将当前日期插入 oracle 数据库?

sql - SQL 中按大小写结果排序

mysql - 使用 sql DISTINCT 获取唯一行列表

SQL Server : how to transpose rows into columns

c# - 手动键入 sql 以映射到 c# 对象,就像 .Include ("") 方法

c# - 如何使用 C# 运行 SQL 事务(使用 TSql110Parser)

sql - 表格驱动的付款时间表