Il me semble me souvenir que (sur Oracle) il y a une différence entre prononcer select count(*) from any_table
et select count(any_non_null_column) from any_table
.
Quelles sont les différences entre ces deux déclarations, le cas échéant?
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(*)
est utilisée.COUNT(*)
,COUNT(<constant>)
etCOUNT(<column name>)
que toutes les trois pourraient être préfixées parALL
ouDISTINCT
(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 queCOUNT(*)
.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:
est facile à lire et à comprendre ce que vous essayez de faire, et
est plus difficile à lire parce que
any_non_null_column
est vraiment appliquée commenot null
En bref, utilisez
count(*)
la source
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 (*)
la source
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:
Cela permet à la fonction COUNT de fonctionner sur le même pied d'égalité, quel que soit le moteur de stockage ou le SGBDR.
la source