l'ajout d'une commande par à cette requête retourne plus vite que sans, pourquoi?
-
16-10-2019 - |
Question
Toutes les idées sur pourquoi l'ajout d'une sorte à cette requête retourne plus vite que sans considérablement l'ordre par? J'attendre au contraire si ce qui pourrait y arriver?
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
Les plans d'exécution ne sont pas beaucoup à aider.
La solution
La cause la plus évidente serait que sous-requête (select max(ID) from tblR where cID = c.cID and ISNULL(aField,'') <> '')
dans la clause WHERE
en combinaison avec le TOP 500
fait l'ordre de faire une différence.
Dans les deux cas, il sera probablement en cours d'exécution de cette sous-requête individuellement pour chaque ligne, il pourrait par ailleurs revenir jusqu'à ce qu'il a trouvé 500 qui correspondent à l'ensemble WHERE
(en fait, il sera assez brillant pour vérifier les autres parties du WHERE premier , car ils sont beaucoup moins chers, mais il sera en cours d'exécution de la sous-requête pour une partie des lignes qu'elle rencontre). Lors d'une estimation, plus de lignes près du sommet lorsqu'ils sont triés par correspondance c.cID actuellement il doit courir moins souvent la sous-requête avant de trouver 500 matchs qu'il fait lors de l'exécution vers le bas les résultats dans l'ordre dans lequel les Chooses de planificateur de requêtes par défaut.
(je suppose que les c
s devraient être x
s ou vice-versa, sinon la requête ne fonctionneraient pas comme c
alias est définie nulle part)
Il convient de requêtes en cours d'exécution comme ça dans le Management Studio avec le « plan de requête réelle » voir activée -. Vous pouvez voir du diagramme quelles parties sont à l'origine de la performance differeing