web-dev-qa-db-fra.com

Quelle est la différence entre select count (*) et select count (any_non_null_column)?

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?

58
Martin
  • COUNT (*) inclura NULLS
  • COUNT (column_or_expression) ne le fera pas.

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.

72
gbn

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

  1. c'est plus long
  2. c'est moins reconnaissable
  3. vous devez vous demander si 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 (*)?

9
Uwe Hesse

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.

1
RolandoMySQLDBA