l'aggiunta di un ordine da parte a questa query restituisce più veloce rispetto a meno, perché?
-
16-10-2019 - |
Domanda
Tutte le idee su perché l'aggiunta di una specie a questa domanda rendimenti notevolmente più veloce che senza l'ordine? Mi sarei aspettato il contrario in modo da che cosa potrebbe fare questo accadere?
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
I piani di esecuzione non stanno aiutando fuori molto.
Soluzione
La causa più ovvia sarebbe che (select max(ID) from tblR where cID = c.cID and ISNULL(aField,'') <> '')
sub-query nella clausola WHERE
in combinazione con il TOP 500
sta compiendo l'ordine fare la differenza.
In entrambi i casi sarà probabilmente in esecuzione che sub-query singolarmente per ogni riga che potrebbe altrimenti tornare fino a quando non ha trovato 500 che corrispondono l'intera WHERE
(in realtà, sarà abbastanza luminoso per controllare le altre parti del WHERE prima , in quanto sono molto meno costosi, ma ancora verrà eseguito il sub-query per una parte delle righe che incontra). A occhio e croce, più righe vicino alla parte superiore quando ordinato secondo c.cID partita attualmente quindi deve eseguire il sub-query meno spesso prima di trovare 500 partite di quanto non faccia durante l'esecuzione in giù i risultati nell'ordine i Sceglie di query planner per impostazione predefinita.
(sto supponendo che le c
s dovrebbero essere x
s o viceversa, altrimenti la query non funzionerebbero come c
alias non è definito sul web)
E 'opportuno l'esecuzione di query del genere nel Management Studio con il "piano di query vera e propria" vedere acceso -. Allora si potrebbe vedere dal diagramma che le parti stanno causando le prestazioni differeing