Count(*) vs Count(1) - SQL Server

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-