J'aurais supposé que lorsqu'une requête inclut TOP n, le moteur de base de données l'exécutait en ignorant la clause TOP, puis, à la fin, réduisait simplement le résultat défini au nombre n de lignes demandé. Le plan d'exécution graphique semble indiquer que c'est le cas - TOP est la "dernière" étape. Mais il semble qu'il se passe plus de choses.
La formulation de ce qui précède me fait penser que vous pouvez avoir une image mentale incorrecte de la façon dont une requête s'exécute. Un opérateur dans un plan de requête n'est pas une étape (l'ensemble des résultats d'une étape précédente est évalué par la suivante.
SQL Server utilise un modèle d'exécution en pipeline , dans lequel chaque opérateur expose des méthodes telles que Init () , GetRow () et Close () . Comme le suggère le nom GetRow () , un opérateur génère une ligne à la fois à la demande (à la demande de son opérateur parent). Ceci est documenté dans la référence de la documentation en ligne , Opérateurs physiques et logiques , avec des informations plus détaillées dans mon article de blog Pourquoi les plans de requête sont-ils inversés ? Ce modèle de rangée à la fois est essentiel pour former une intuition solide pour l'exécution de requêtes.
Ma question est la suivante: comment (et pourquoi) une TOP
clause n affecte-t-elle le plan d'exécution d'une requête?
Certaines opérations logiques, telles que les TOP
semi-jointures et l' FAST n
indicateur de requête, affectent la manière dont l'optimiseur de requêtes calcule les variantes du plan d'exécution. L'idée de base est qu'une forme de plan possible peut renvoyer les n premières lignes plus rapidement qu'un plan différent optimisé pour renvoyer toutes les lignes.
Par exemple, la jointure de boucles imbriquées indexées est souvent le moyen le plus rapide de renvoyer un petit nombre de lignes, bien que la jointure de hachage ou de fusion avec des analyses puisse être plus efficace sur des ensembles plus volumineux. L'optimiseur de requêtes raisonne ces choix en définissant un objectif de ligne à un point particulier de l'arborescence logique des opérations.
Un objectif de ligne modifie le mode de calcul du coût des alternatives du plan de requête. L’essentiel est que l’optimiseur commence par chiffrer le coût de chaque opérateur comme si l’ensemble des résultats était requis, puis fixait un objectif de ligne au point approprié, puis redescendait l’arborescence du plan en estimant le nombre de lignes qu’il devait examiner. pour atteindre l'objectif de la ligne.
Par exemple, une logique TOP(10)
définit un objectif de ligne de 10 à un point particulier de l'arborescence de la requête logique. Les coûts des opérateurs menant à l'objectif de la ligne sont modifiés pour estimer le nombre de lignes à produire pour atteindre l'objectif de la ligne. Ce calcul peut devenir complexe, il est donc plus facile de comprendre tout cela avec un exemple entièrement travaillé et des plans d'exécution annotés. Les objectifs de ligne peuvent affecter davantage que le type de jointure ou si les recherches et les recherches sont préférées aux analyses. Plus de détails à ce sujet ici .
Comme toujours, un plan d'exécution sélectionné sur la base d'un objectif de rangée est soumis aux capacités de raisonnement de l'optimiseur et à la qualité des informations qui lui sont fournies. Tous les plans avec un objectif de rangée ne produiront pas le nombre de rangées requis plus rapidement dans la pratique, mais selon le modèle de calcul des coûts, ce sera le cas.
Lorsqu'un plan d'objectif de ligne ne s'avère pas plus rapide, il existe généralement des moyens de modifier la requête ou de fournir de meilleures informations à l'optimiseur de manière à optimiser le plan sélectionné naturellement. Quelle option est appropriée dans votre cas dépend des détails bien sûr. La fonctionnalité d'objectif de ligne est généralement très efficace (bien qu'un bogue soit à surveiller lorsqu'il est utilisé dans des plans d'exécution parallèles).
Votre requête et votre plan particuliers peuvent ne pas convenir à une analyse détaillée ici (vous fournirez certainement un plan d’exécution réel si vous le souhaitez), mais nous espérons que les idées exposées ici vous permettront d’avancer.
ORDER BY
clause. Ajout deTOP
modifications là où cela se produit dans le plan, mais je suis plus préoccupé par la manière dont il affecte le nombre d'exécutions de recherches d'index sur la table B ... (bien sûr, les deux peuvent être liées - je ne sais pas)