2008-09-12 18 views

Respuesta

13

Decir que SELECT COUNT(*) vs COUNT(1) resultados en su DBMS regresar " columnas "es pura litera. Eso puede haber sido el caso hace mucho, mucho pero cualquier optimizador de consultas se precie va a elegir un método rápido para contar las filas de la tabla - no es NO diferencia de rendimiento entre SELECT COUNT(*), COUNT(1), COUNT('this is a silly conversation')

Por otra parte, SELECT(1) vs SELECT(*) no lo hará tiene alguna diferencia en el uso de ÍNDICE; la mayoría de los DBMS realmente optimizarán SELECT(n) into SELECT(*) de todos modos. Ver el TOM ASK: Oracle ha sido la optimización de SELECT(n) into SELECT(*) para la mayor parte de una década, si no más: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1156151916789

problema es en el recuento (col) para contar () conversión ** 03/23/00 05:46 pm *** una solución consiste en establecer el evento 10122 a desactivar count (col) -> count () optimización.Otro ejemplo es para cambiar el conteo (col) a contar (), significa lo mismo, cuando el col tiene una restricción NOT NULL. El número de error es 1215372.

Una cosa a notar - si está utilizando COUNT (col) (! No lo hacen) y col es marcada NULL, lo que realmente tendrá que contar el número de apariciones en la tabla (ya sea a través de escaneo de índice, histograma, etc., si es que existen, o un escaneo completo de tabla de lo contrario).

En pocas palabras: si lo que quiere es el recuento de filas en una tabla, utilice COUNT (*)

+0

No es correcto decir que no hay diferencia entre select (n) y select (*). Si tiene un índice de cobertura que incluye n, obtiene los datos directamente del nivel de hoja del índice y no tiene que volver a la tabla, que es mucho más rápido. –

+1

El optimizador de DBMS * se dará cuenta * de esto y elegirá el índice correcto para el trabajo. Siempre que haya un índice, es raro el día en que he visto un DBMS ** contar ** filas en la mesa. Además, la presencia de NULL a menudo causa errores semánticos. Cuando quieras el # de filas en una tabla, usa COUNT (*) !!! –

5
+0

Eso es muy similar (y puede ser la misma respuesta), pero me preguntaba si hay una diferencia entre hacer referencia a una columna específica (es decir, COUNT (columna)) en comparación con hacer referencia a una cadena arbitraria (es decir, COUNT ('x')) – Andrew

3

La principal diferencia de rendimiento es que COUNT (*) pueden ser satisfechas mediante el examen de la clave principal en la mesa.

es decir, en el caso simple a continuación, la consulta volverá de inmediato, sin necesidad de examinar ninguna fila.

select count(*) from table 

no estoy seguro de si el optimizador de consultas en SQL Server lo hará, pero en el ejemplo anterior, si la columna está agrupando tiene un índice el servidor debe ser capaz de satisfacer la consulta sin golpear la mesa real en absoluto.

Para aclarar: esta respuesta se refiere específicamente a SQL Server. No sé cómo otros productos DBMS manejan esto.

3

Esta pregunta es ligeramente diferente a la otra referencia. En la pregunta a la que se hace referencia, se preguntó cuál era la diferencia al usar count (*) y count (SomeColumnName) y SQLMenace's answer.

Para abordar esta cuestión, esencialmente no hay diferencia en el resultado. Tanto el recuento (*) como el recuento ('x') y el conteo (1) devolverán el mismo número. La diferencia es que cuando se usa "*" como en un SELECCIONAR, todas las columnas se devuelven y se cuentan. Cuando se usa una constante (por ejemplo, 'x' o 1), se devuelve una fila con una columna y luego se cuenta. La diferencia de rendimiento se verá cuando "*" devuelva muchas columnas.

actualización: La declaración anterior sobre el rendimiento probablemente no es del todo bien como se discute en otras respuestas, pero se aplica a subseleccionar consultas cuando se utiliza existe y existe no

+0

¿Eso significa que COUNT ('x') sería más rápido si la tabla tuviera muchas columnas, en comparación con COUNT (*)? – Andrew

+0

Creo que este comportamiento depende de la base de datos y la optimización de la consulta aplicada. Es una optimización obvia para realizar cuando ve COUNT (*). Solo puede significar una cosa, desea el recuento total de filas, independientemente de la cantidad de columnas que tenga la tabla. – Brannon