Question

Pour une requête modérément complexe que j'essaie d'optimiser, j'ai remarqué que la suppression du TOP n La clause modifie le plan d'exécution. J'aurais deviné que lorsqu'une requête comprend TOP n Le moteur de la base de données exécuterait la requête en ignorant le TOP clause, puis à la fin réduisez ce résultat fixé n Nombre de lignes demandées. 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.

Ma question est de savoir comment (et pourquoi) une clause N Top N a-t-elle un impact sur le plan d'exécution d'une requête?

Voici une version simplifiée de ce qui se passe dans mon cas:

La requête correspond aux lignes de deux tables, A et B.

Sans le TOP Clause, les estimations de l'optimiseur il y aura des lignes de 19 km à partir des tableaux A et 46k du tableau B. Le nombre réel de lignes renvoyés est de 16k pour A et 13K pour B. Une correspondance de hachage est utilisée pour rejoindre ces deux ensembles de résultats pour un total de 69 lignes (alors un tri est appliqué). Cette requête se produit très rapidement.

Quand j'ajoute TOP 1001 L'optimiseur n'utilise pas de correspondance de hachage; Au lieu de cela, il trie d'abord les résultats du tableau A (même estimation / réel de 19k / 16k) et fait une boucle imbriquée contre le tableau B. Le nombre estimé de lignes pour le tableau B est maintenant 1, et l'étrange est que le TOP n affecte directement le nombre estimé d'exécutions (recherche d'index) contre B - il semble toujours être 2N + 1, ou dans mon cas 2003. Cette estimation change en conséquence si je change TOP n. Bien sûr, comme il s'agit d'un imbécile, jointe, le nombre réel d'exécutions est de 16k (le nombre de lignes du tableau A) et cela ralentit la requête.

Le scénario réel est un peu plus complexe, mais cela capture l'idée / comportement de base. Les deux tables sont recherchées à l'aide des chercheurs d'index. Il s'agit de SQL Server 2008 R2 Enterprise Edition.

Pas de solution correcte

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