Me parece recordar que (en Oracle) hay una diferencia entre pronunciar select count(*) from any_table
y select count(any_non_null_column) from any_table
.
¿Cuáles son las diferencias entre estas dos declaraciones, si las hay?
Esto significa COUNT(any_non_null_column)
que dará lo mismo que, COUNT(*)
por supuesto, porque no hay valores NULL para causar diferencias.
En general, COUNT(*)
debería ser mejor porque se puede usar cualquier índice porque COUNT(column_or_expression)
no se puede indexar o SARGable
De ANSI-92 (busque " Scalar expressions 125
")
Caso:
a) Si se especifica COUNT (*), entonces el resultado es la cardinalidad de T.
b) De lo contrario, deje que TX sea la tabla de una sola columna que es el resultado de aplicar la <expresión de valor> a cada fila de T y eliminar los valores nulos. Si se eliminan uno o más valores nulos, se genera una condición de finalización: advertencia: se elimina el valor nulo en la función establecida.
Las mismas reglas se aplican a SQL Server y Sybase también al menos
Nota: COUNT (1) es lo mismo que COUNT (*) porque 1 es una expresión no anulable.
count(*)
se usa.COUNT(*)
,COUNT(<constant>)
yCOUNT(<column name>)
que las tres podrían tener el prefijoALL
oDISTINCT
(por defectoALL
si se omite). Me pregunto qué expresión se puede usar donde dices_or_expression
.COUNT(1)
como un ejemplo inútil, es lo mismo queCOUNT(*)
.COUNT(CASE WHEN a>b THEN 1 END)
como un ejemplo que cuenta filas donde a> b.En cualquier versión reciente (es decir, 8.x + ) de Oracle, hacen lo mismo . En otras palabras, la única diferencia es semántica:
es fácilmente legible y obvio lo que está tratando de hacer, y
es más difícil de leer porque
any_non_null_column
realmente se aplica comonot null
En resumen, use
count(*)
fuente
En una versión reciente, de hecho, no hay diferencia entre count (*) y count ( cualquier columna no nula ), con el énfasis en not null :-) Incidentalmente cubrí ese tema con una publicación de blog: ¿Es count (col) mejor que count (*)?
fuente
En el libro Oracle8i Certified Professional DBA Certification Exam Guide (ISBN 0072130601) , la página 78 dice que COUNT (1) en realidad se ejecutará más rápido que COUNT (*) porque se ponen en juego ciertos mecanismos para verificar el diccionario de datos para la nulabilidad de cada columna (o al menos la primera columna con no anulabilidad) cuando se usa COUNT (*) . COUNT (1) evita esos mecanismos.
MySQL hace trampa para 'SELECT COUNT (1) en tblname;' en las tablas MyISAM leyendo el encabezado de la tabla para el recuento de tablas. InnoDB cuenta cada vez.
Para probar si COUNT (1) se ejecutará más rápido que COUNT (*) en una forma independiente de la base de datos, simplemente ejecute lo siguiente y juzgue el tiempo de ejecución por usted mismo:
Esto hace que la función COUNT opere en el mismo campo de juego, independientemente del motor de almacenamiento o RDBMS.
fuente