46 votes

MAX vs Top 1 - quel est le meilleur ?

J'ai dû revoir du code et je suis tombé sur quelque chose que quelqu'un a fait, et je ne peux pas penser à une raison pour laquelle mon chemin est meilleur et ce n'est probablement pas le cas, alors, qu'est-ce qui est meilleur/plus sûr/plus efficace ?

 SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 GROUP BY event_id

OU

 SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date

J'aurais choisi la 2ème option, mais je ne sais pas pourquoi, et si c'est vrai.

13voto

GSerg Points 33571

Ce sont des requêtes différentes.

Le premier renvoie de nombreux enregistrements (le plus grand a_date pour chaque event_id trouvé dans a_primary_key = 5 )

Le second renvoie un enregistrement (le plus petit a_date trouvé dans a_primary_key = 5 ).

6voto

vol7ron Points 11270

Pour que les requêtes aient le même résultat, vous auriez besoin de :

 SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5

SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date DESC

Le meilleur moyen de savoir lequel est le plus rapide est de vérifier le plan de requête et de faire vos benchmarks. De nombreux facteurs peuvent affecter la vitesse, tels que la taille de la table/du tas, etc. Et même différentes versions de la même base de données peuvent être optimisées pour favoriser une requête par rapport à l'autre.

3voto

Jay Magwadiya Points 157

J'effectue max et top sur une table avec plus de 20 000 000 enregistrements, et a constaté que Top donne un résultat plus rapide avec un ordre supérieur à la fonction max ou min.

Ainsi, le meilleur moyen est d'exécuter à la fois votre requête une par une pendant un certain temps et de vérifier le temps écoulé depuis la connexion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X