la adición de una orden de a esta consulta devuelve más rápido que fuera, ¿por qué?
-
16-10-2019 - |
Pregunta
¿Alguna idea de por qué la adición de una especie a esta consulta devuelve considerablemente más rápido que sin la orden? Yo esperaría lo contrario así que lo que podría hacer que esto suceda?
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
Los planes de ejecución no están ayudando mucho.
Solución
La causa más obvia sería que (select max(ID) from tblR where cID = c.cID and ISNULL(aField,'') <> '')
sub-consulta en la cláusula WHERE
en combinación con el TOP 500
está haciendo el orden a hacer la diferencia.
En cualquier caso, probablemente va a correr ese sub-consulta individual para cada fila de otro modo podría volver hasta que haya encontrado 500 que coincide con toda la WHERE
(en realidad, será lo suficientemente brillante como para comprobar las otras partes de la primera DONDE , ya que son mucho menos costosos, pero todavía va a correr la sub-consulta para una parte de las filas que cumple). Haciendo un cálculo, más filas cerca de la parte superior cuando ordenados por partido c.cid actualmente por lo que tiene que ejecutar la sub-consulta con menos frecuencia antes de encontrar 500 partidos que lo hace cuando se ejecuta abajo de los resultados en el orden que escoge el planificador de consulta por defecto.
(estoy asumiendo que los c
s deben ser x
s o viceversa, de lo contrario la consulta no se presentaría como el c
alias no está definido en cualquier lugar)
Es importante que la ejecución de consultas como en el estudio de gestión con el "plan de consulta real" ver encendido -. Entonces es posible ver en el diagrama qué partes están causando el rendimiento differeing