l'ajout d'une commande par à cette requête retourne plus vite que sans, pourquoi?

dba.stackexchange https://dba.stackexchange.com/questions/634

  •  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.

Était-ce utile?

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 cs devraient être xs 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top