Réponses:
Cela signifie que vous COUNT(any_non_null_column)
obtiendrez la même chose que COUNT(*)
bien sûr car il n'y a pas de valeur NULL pouvant causer des différences.
En règle générale, COUNT(*)
devrait être mieux car tout index peut être utilisé car COUNT(column_or_expression)
ne peut être indexé ou SARGable
À partir de ANSI-92 (recherchez " Scalar expressions 125
")
Cas:
a) Si COUNT (*) est spécifié, le résultat est la cardinalité de T.
b) Sinon, laissez TX être le tableau à colonne unique résultant de l'application de l'expression <value expression> à chaque ligne de T et de l'élimination des valeurs nulles. Si une ou plusieurs valeurs nulles sont éliminées, une condition d'achèvement est alors créée: warning - valeur nulle éliminée dans la fonction set.
Les mêmes règles sont applicables à SQL Server et Sybase aussi au moins
Remarque: COUNT (1) est identique à COUNT (*) car 1 est une expression non Nullable.
COUNT(*)
, COUNT(<constant>)
et COUNT(<column name>)
que toutes les trois pourraient être préfixées par ALL
ou DISTINCT
(par défaut à ALL
omises). Je me demande simplement quelle expression peut être utilisée où vous dites _or_expression
?
COUNT(1)
un exemple inutile, c'est le même que COUNT(*)
. COUNT(CASE WHEN a>b THEN 1 END)
à titre d'exemple, qui compte les lignes où a> b.
Dans toute version récente (c.-à-d. 8.x + ) d’Oracle, ils font la même chose . En d'autres termes, la seule différence est sémantique:
select count(*) from any_table
est facile à lire et à comprendre ce que vous essayez de faire, et
select count(any_non_null_column) from any_table
est plus difficile à lire parce que
any_non_null_column
est vraiment appliquée commenot null
En bref, utilisezcount(*)
Dans une version récente, il n'y a en effet aucune différence entre count (*) et count ( toute colonne non nulle ), l'accent étant mis sur not null :-) J'ai accessoirement couvert ce sujet avec un article de blog: Est-ce que count (col) vaut mieux que count (*)
Dans le livre Oracle8i Certified Professional Guide d’examen de certification DBA (ISBN 0072130601) , page 78 indique que COUNT (1) sera plus rapide que COUNT (*), car certains mécanismes sont mis en œuvre pour vérifier le dictionnaire de données pour la nullité de chaque colonne (ou au moins la première colonne avec non-nullability) lorsqu’on utilise COUNT (*) . COUNT (1) contourne ces mécanismes.
MySQL triche pour 'SELECT COUNT (1) on tblname;' sur les tables MyISAM en lisant l’en-tête du nombre de tables. InnoDB compte à chaque fois.
Pour tester si COUNT (1) fonctionnera plus vite que COUNT (*) d'une manière agnostique à la base de données, il suffit d'exécuter ce qui suit et d'évaluer le temps d'exécution par vous-même:
SELECT COUNT(1) FROM tblname WHERE 1 = 1;
SELECT COUNT(*) FROM tblname WHERE 1 = 1;
SELECT COUNT(column-name) FROM tblname WHERE 1 = 1;
Cela permet à la fonction COUNT de fonctionner sur le même pied d'égalité, quel que soit le moteur de stockage ou le SGBDR.
count(*)
est utilisée.