关于为什么向此查询添加排序返回比没有排序要快得多的任何想法?我会期待相反的结果,那么什么会导致这种情况发生?
SELECT TOP (500) r.cID,r.aField,a.Description
FROM dbo.tblR r
inner join dbo.tblA a on r.aID = a.ID
left join dbo.tblX x on x.cID = r.cID
WHERE (ISNULL(x.anotherField,'') <> r.anotherField or x.field3 is null)
and (r.ID=(select max(ID) from tblR where cID = r.cID and
ISNULL(aField,'') <> ''))
and r.cID in (select ID from tblC)
ORDER BY r.cID ASC -- when I comment this line out it runs much slower
执行计划没有多大帮助。
最明显的原因是子句中
(select max(ID) from tblR where cID = c.cID and ISNULL(aField,'') <> '')
的子查询与 theWHERE
相结合TOP 500
使顺序有所不同。在任何一种情况下,它都可能会为它可能返回的每一行单独运行该子查询,直到它找到与整个匹配的 500 个
WHERE
(实际上,它会足够亮以首先检查 WHERE 的其他部分,因为它们是便宜得多,但它仍然会为它遇到的部分行运行子查询)。猜测一下,当前按 c.cID 排序时,靠近顶部的行更多匹配,因此它必须在找到 500 个匹配项之前运行子查询的频率低于按照查询计划程序默认选择的顺序运行结果时运行的频率。(我假设
c
s 应该是x
s 或反之亦然,否则查询将不会运行,因为别名c
未在任何地方定义)在启用“实际查询计划”视图的情况下,在 Management Studio 中运行类似的查询是值得的 - 然后您可能会从图中看到哪些部分导致了不同的性能。