将订单添加到此查询的返回速度比没有的速度快,为什么?
-
16-10-2019 - |
题
关于为什么在此查询中添加某种排序的任何想法比没有订单的情况要快得多?我会期望相反,所以会发生什么?
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,'') <> '')
子查询 WHERE
条款与 TOP 500
正在订单有所作为。
无论哪种情况,它都可能会针对每行分别运行该子查询,否则它可能会返回,直到找到500匹配整个 WHERE
(实际上,要检查第一部分的其他部分,因为它们的价格要便宜得多,但是它仍然会运行遇到的一部分行的子问题)。猜测,当当前用C.CID匹配排序时,在顶部附近的行还要多,因此在找到500匹配之前,它必须少于频率运行的频率,而不是按顺序降低结果查询计划者在默认情况下选择的结果。
(我假设 c
S应该是 x
反之亦然,否则查询不会作为别名运行 c
在任何地方都没有定义)
值得在管理工作室中使用“实际查询计划”视图打开的“实际查询”中的查询 - 然后,您可以从图中看到哪些部分导致了扩散性能。
不隶属于 dba.stackexchange