【发布时间】:2021-01-09 08:10:36
【问题描述】:
所以我有这个查询:
SELECT *
FROM ViewTechnicianStatus
WHERE NotificationClass = 2
AND MachineID IN (SELECT ID FROM MachinesTable WHERE DepartmentID = 1 AND IsMachineActive <> 0)
--ORDER BY ResponseDate DESC
视图庞大而复杂,包含许多连接和子查询。当我运行此查询时,它需要永远完成,但是如果我添加 ORDER BY 它会立即完成并按预期返回 20 行。我不明白如何添加 ORDER BY 会对性能产生如此巨大的积极影响。如果有人可以向我解释这种现象,我会很高兴。
编辑:
这是带有SET STATISTICS TIME, IO ON; 标志的概要。抱歉隐藏的表名,但我认为我不能公开这些。
【问题讨论】:
-
您确定您的观察结果确实具有可重复性吗?添加
ORDER BY本身不应该,AFIAK,永远更快 进行查询。如果你也使用TOP,那么它可能会改变运行时间。 -
@TimBiegeleisen 我在 3 个不同的客户端(相同的数据结构,不同的数据)上运行了这个查询,性能差异是相同的,所以我可以确定它是可重现的。
-
我想你已经这样做了,但鉴于这是一个奇怪的情况,最好确认一下 - 你是否以不同的顺序多次运行这些查询(例如,首先在不同的数据库上运行包括排序?可能是数据被缓存了,或者第一次创建执行计划需要很长时间(我在这里采摘稻草)。在运行这两个之前,另一个故障排除步骤是
SET STATISTICS TIME, IO ON;,并且看看在两个查询中所做的事情之间是否有任何重大差异。 -
@seanb 编辑了帖子以包含
SET STATISTICS TIME, IO ON;结果。请看一下 -
问题太模糊无法回答,这种事情偶尔会碰巧发生。它可能有错误的基数估计,导致它使用嵌套循环,
order by鼓励合并连接,例如
标签: sql sql-server-2008