web-dev-qa-db-fra.com

SQL Server, Top contre Row_Number

J'apprends des plans d'exécution et j'essaie différentes requêtes et en comparant leur performance et trébucha 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 rendent tous les deux le même ensemble de résultats - cependant premier exécuté plus vite et moins de ressources affamées (au moins SSMS me dit que) voici des plans d'exécution: Execution plans

Comparaison de SQL Query Plan Explorer: enter image description here 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-ils? S'il y a autre chose dont vous avez besoin - faites le moi savoir.

Merci, Evaldas.

8
Evaldas Buinauskas

Je suppose que vous comparez les coûts estimés pour les questions. Ce ne sont que des estimations basées sur (entre autres) le nombre estimé de rangées retournées par la requête. Pas le nombre réel de lignes.

Votre première requête a estimé qu'il retournerait 30 rangées et votre deuxième requête estimait 1000 rangées. C'est là que vient votre différence de coût de requête.

Si vous modifiez les requêtes pour rechercher seulement 30 rangées, vous verrez que les lignes estimées sont identiques pour les requêtes et la première requête est en réalité coûtée un peu plus élevée, du moins pour moi dans SQL Server 2014.

N'utilisez pas les estimations lors de la comparaison des performances des requêtes. Utilisez des objets comme la durée, le nombre de lectures et de la taille des subventions de mémoire.

11
Mikael Eriksson