16 votes

Meilleure pratique SQL : count(1) ou count(*)

Duplicata possible :
Compte(*) vs Compte(1)

Je me souviens qu'on m'a dit, de manière anecdotique :

n'utilisez jamais count(*) lorsque count(1) fait l'affaire

Récemment, j'ai transmis ce conseil à un autre développeur, et on m'a demandé de prouver que c'était vrai. Mon argument était ce qu'on m'avait dit en même temps que le conseil : que la base de données ne renverrait que la première colonne, qui serait alors comptée. Le contre-argument était que la base de données n'évaluerait rien dans les parenthèses.

D'après quelques essais (non scientifiques) sur de petites tables, il ne semble pas y avoir de différence. Je n'ai actuellement pas accès à de grandes tables pour faire des essais.

On m'a donné ce conseil lorsque j'utilisais Sybase et que les tables comptaient des centaines de millions de lignes. Je travaille maintenant avec Oracle et j'ai beaucoup moins de données.

Donc je suppose qu'en résumé, mes deux questions sont :

  1. Lequel est le plus rapide, count(1) ou count(*) ?
  2. Cela varie-t-il selon les différents fournisseurs de bases de données ?

20voto

andy Points 885

Selon une autre question similaire ( Compte(*) vs Compte(1) ), ils sont les mêmes.

Dans Oracle, selon Demandez à Tom En effet, count(*) est la façon correcte de compter le nombre de lignes, car l'optimiseur modifie count(1) en count(*). count(1) signifie en fait compter les lignes dont les 1 ne sont pas nuls (tous sont non nuls, l'optimiseur le modifie pour vous).

8voto

hatchet Points 7251

4voto

Nathanial Woolls Points 4106

En lisant des livres portant spécifiquement sur TSQL et Microsoft SQL Server, j'ai lu que l'utilisation de * est meilleure car elle laisse l'optimiseur décider de ce qu'il convient de faire. Je vais essayer de trouver les noms des livres spécifiques et les poster ici.

3voto

le dorfier Points 27267

C'est un modèle de requête tellement basique, et la signification est identique. J'ai lu plus d'une fois que l'optimiseur les traite de manière identique - je ne peux pas trouver de référence précise pour l'instant, mais je range cela dans la catégorie des "connaissances institutionnelles".

(j'aurais dû chercher d'abord...http://stackoverflow.com/questions/1221559/count-vs-count1)

2voto

Henry Lee Points 163

Je ne peux parler que de SQL Server, mais lors d'un test sur une table de 5 Go, 11 millions d'enregistrements, le nombre de lectures et le plan d'exécution étaient identiques.

Je dirais qu'il n'y a pas de différence.

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