J'apprends les plans d'exécution et j'essaie différentes requêtes et je compare leurs performances et je suis tombé sur ceci:
SELECT StatisticID
FROM (
SELECT StatisticID, ROW_NUMBER() OVER (ORDER BY StatisticID) AS rn
FROM FTCatalog.Statistic
) AS T
WHERE T.rn <= 1000
ORDER BY rn
SELECT TOP 1000 StatisticID
FROM FTCatalog.Statistic
ORDER BY StatisticID
Ils retournent tous les deux le même jeu de résultats - cependant le premier s'exécute plus rapidement et consomme moins de ressources (au moins SSMS me le dit) Voici les plans d'exécution:
Comparaison de SQL Query Plan Explorer: Quelqu'un pourrait-il me donner un aperçu de ce qui se passe réellement dans les coulisses et pourquoi les résultats diffèrent? S'il y a autre chose dont vous avez besoin - faites le moi savoir.
Merci, Evaldas.
sql-server
query-performance
execution-plan
Evaldas Buinauskas
la source
la source
Réponses:
Je suppose que vous comparez les coûts estimés pour les requêtes. Ce ne sont que des estimations basées sur (entre autres) le nombre estimé de lignes renvoyées par la requête. Pas le nombre réel de lignes.
Votre première requête a estimé qu'elle retournerait 30 lignes et votre deuxième requête a estimé 1000 lignes. C'est de là que vient votre différence de coût de requête.
Si vous modifiez les requêtes pour extraire seulement 30 lignes, vous verrez que les lignes estimées sont les mêmes pour les requêtes et que la première requête est en fait un peu plus chère, du moins pour moi dans SQL Server 2014.
N'utilisez pas les estimations lorsque vous comparez les performances des requêtes. Utilisez plutôt des choses comme la durée, le nombre de lectures et la taille des allocations de mémoire.
la source