【问题标题】:Stable SQL Server stored procedure unusual drop in performance稳定的 SQL Server 存储过程性能异常下降
【发布时间】:2015-04-30 17:05:24
【问题描述】:

我在 SQL Server 2005 中遇到了一个非常奇怪的问题。

昨天用户报告我们的数据库应用程序的特定部分运行缓慢。我不确定缓慢是多么普遍——它肯定不是无处不在,因为这是系统报告的唯一部分——但我隔离了相关的存储过程,它曾经在 2-3 秒内运行,现在一直运行在 50- 60 秒。

这是一个复杂的查询——多层子查询。它仅返回 16 列中的 42 行。

查询如下所示:

select col1,2,3,4,5,...
from 
( select .... ) t
ORDER BY col1

我开始分解查询以找出缓慢的原因,并发现删除最后的ORDER BY 子句使性能恢复正常。

这是非常神秘的。我无法在我们的 DEV 服务器上复制该问题。它只有 42 行,所以 order by 子句应该是无关紧要的。执行计划在两台服务器上是相同的,但没有顺序。

任何关于我们的生产服务器可能发生变化的头脑风暴将不胜感激!

【问题讨论】:

  • 任何数量的东西,但如果它只是这一个查询,它可能是未完成的写锁 - 除非您指定 (nolock),否则查询将使用读锁,这不一定是一件好事。它也可能是其中一张表上的索引碎片。
  • 你有执行计划前后对比吗?您是否至少有一个执行后的计划可以查看?
  • 在 prod 现在,执行计划在有和没有 order by 的版本之间是相同的,只是为 order by 版本添加了最后一个排序运算符。我在 DEV 上生成了一个执行计划,没有出现问题,而且它也是相同的。
  • 是的,您可以尝试重建索引。
  • 我会试一试,谢谢!

标签: sql-server stored-procedures sql-server-2005 sqlperformance


【解决方案1】:

在 BiggestTableInQuery 上全部更改索引 重建;

成功了!它非常分散,5 个索引上 55-98%,聚集 55%。所以现在我也要回顾一下其他大表。

感谢 rcl 的 simon 和 Tab Alleman!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多