Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

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

Il n'y a aucune différence.

Raison :

Les livres en ligne indiquent "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.

Identique à 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ême IO, même plan, les travaux

Edit, août 2011

Question similaire sur DBA.SE.

Edit, décembre 2011

COUNT(*) est spécifiquement mentionné dans ANSI-92 (recherchez "Scalar expressions 125 ")

Cas :

a) Si COUNT(*) est spécifié, alors le résultat est la cardinalité de T.

Autrement dit, la norme ANSI le reconnaît comme saignant évident ce que vous voulez dire. COUNT(1) a été optimisé par les fournisseurs de SGBDR parce que de cette superstition. Sinon, il serait évalué selon ANSI

b) Sinon, soit TX le tableau à une seule colonne qui résulte de l'application de l' à chaque ligne de T et de l'élimination des valeurs nulles. Si une ou plusieurs valeurs nulles sont éliminées, alors une condition de complétion est levée :avertissement-