Il me semble 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 COUNT(any_non_null_column)
donnera la même chose que COUNT(*)
bien sûr car il n'y a pas de valeurs NULL pour provoquer des différences.
Généralement, COUNT(*)
devrait être meilleur car n'importe quel index peut être utilisé car COUNT(column_or_expression)
peut ne pas être indexé ou SARGable
De ANSI-92 (recherchez "Scalar expressions 125
")
Cas:
a) Si COUNT (*) est spécifié, alors le résultat est la cardinalité de T.
b) Sinon, soit TX la table à une seule colonne résultant de l'application de l '<expression de valeur> à 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 - valeur nulle éliminée dans la fonction set.
Les mêmes règles s'appliquent également à SQL Server et Sybase au moins
Remarque: COUNT (1) est identique à COUNT (*) car 1 est une expression non nullable.
Dans toute version récente (ie 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 facilement lisible et évident ce que vous essayez de faire, et
select count(any_non_null_column) from any_table
est plus difficile à lire car
any_non_null_column
est vraiment appliqué comme not null
En bref, utilisez count(*)
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 non nul :-) A accidentellement couvert ce sujet avec un article de blog: Est-ce que count (col) est meilleur que count (*)?
Dans le livre Oracle8i Certified Professional DBA Certification Exam Guide (ISBN 0072130601) , la page 78 indique que COUNT (1) s'exécutera plus rapidement que COUNT (*) parce que certains mécanismes sont appelés pour vérifier le dictionnaire de données pour la nullité de chaque colonne (ou au moins la première colonne avec non-nullabilité) lors de l'utilisation de 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 de table pour le nombre de tables. InnoDB compte à chaque fois.
Pour tester si COUNT (1) fonctionnera plus rapidement que COUNT (*) d'une manière indépendante de la base de données, exécutez simplement ce qui suit et jugez vous-même le temps d'exécution:
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 fait que la fonction COUNT fonctionne sur le même pied d'égalité, quel que soit le moteur de stockage ou le SGBDR.