向此查询添加订单返回比不添加更快,为什么?

Bet*_*zel 6 sql-server-2005 order-by

关于为什么向此查询添加排序的任何想法比没有 order by 的返回速度要快得多?我希望相反,那么什么会导致这种情况发生?

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
Run Code Online (Sandbox Code Playgroud)

执行计划没有多大帮助。

Dav*_*ett 3

最明显的原因是子句(select max(ID) from tblR where cID = c.cID and ISNULL(aField,'') <> '')中的子查询WHERE与 is 组合TOP 500使顺序产生差异。

在任何一种情况下,它可能会为它可能返回的每一行单独运行该子查询,直到找到 500 个与整体匹配的行WHERE(实际上,它足够明亮,可以首先检查 WHERE 的其他部分,因为它们是便宜得多,但它仍然会针对它遇到的一部分行运行子查询)。据猜测,当前按 c.cID 排序时,靠近顶部的行更多,因此在找到 500 个匹配项之前,与按查询规划器默认选择的顺序运行结果时相比,运行子查询的频率要少一些。

(我假设cs 应该是xs 或反之亦然,否则查询将不会运行,因为别名c未在任何地方定义)

值得在打开“实际查询计划”视图的 Management Studio 中运行这样的查询 - 然后您可能会从图表中看到哪些部分导致了不同的性能。