Count(*) vs Count(1) - SQL Server
Il n’y a aucune différence.
Raison :
Books on-line indique « COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } ) »
« 1 » est une expression non-nulle : c’est donc la même chose que COUNT(*).
L’optimiseur le reconnaît pour ce qu’il est : trivial.
C’est la même chose que EXISTS (SELECT * ... ou EXISTS (SELECT 1 ...
Exemple :
SELECT COUNT(1) FROM dbo.tab800krows
SELECT COUNT(1),FKID FROM dbo.tab800krows GROUP BY FKID
SELECT COUNT(*) FROM dbo.tab800krows
SELECT COUNT(*),FKID FROM dbo.tab800krows GROUP BY FKID
Mêmes E/S, même plan, tout pareil
Modification, août 2011
Question similaire sur DBA.SE.
Modification, décembre 2011
COUNT(*) est mentionné spécifiquement dans ANSI-92 (cherchez « Scalar expressions 125 »)
Cas :
a) Si COUNT(*) est spécifié, alors le résultat est la cardinalité de T.
C’est-à-dire que la norme ANSI reconnaît comme évident ce que vous voulez dire. COUNT(1) a été optimisé par les éditeurs de SGBDR à cause de cette superstition. Sinon, il serait évalué selon la norme ANSI
b) Sinon, soit TX la table à une seule colonne qui est le
résultat de l’application de la à chaque ligne de T
et de l’élimination des valeurs nulles. Si une ou plusieurs valeurs nulles sont
éliminées, alors une condition d’achèvement est levée : avertissement-