639 votos

Count (*) vs Conde (1)

Sólo me preguntaba si alguno de ustedes usan Count(1) sobre Count(*) y si hay una diferencia notable en el rendimiento o si esto es sólo un hábito heredado que se ha adelantado a partir de los días pasados ​​pasado?

(La base de datos específica es SQL Server 2005)

538voto

gbn Puntos 197263

No hay ninguna diferencia.

Razón:

Libros en línea dice "COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )"

"1" es una organización no-null expresión: así que es la misma como COUNT(*). El optimizador de lo reconoce por lo que es: trivial.

El mismo como EXISTS (SELECT * ... o EXISTS (SELECT 1 ...

Ejemplo:

SELECT COUNT(1) FROM dbo.tab800krows
SELECT COUNT(1),FKID FROM dbo.tab800krows GROUP BY FKID

SELECT COUNT(*) FROM dbo.tab800krows
SELECT COUNT(*),FKID FROM dbo.tab800krows GROUP BY FKID

Mismo IO, mismo plan, las obras

Edición, Agosto De 2011

Pregunta Similar en DBA.SE.

Edición, Diciembre De 2011

COUNT(*) se menciona específicamente en la norma ANSI-92 (buscar por "Scalar expressions 125")

Caso:

a) Si COUNT(*) es especificado, entonces el resultado es la cardinalidad de T.

Es decir, el estándar ANSI reconoce como sangrado evidente lo que quieres decir. COUNT(1) ha sido optimizado por RDBMS vendedores porque de esta superstición. De lo contrario será evaluado según la norma ANSI

b) de lo Contrario, vamos a TX ser la tabla de una columna que es la resultado de la aplicación de la <expresión de valor> para cada fila de T y la eliminación de los valores null. Si uno o más valores null eliminado, entonces una condición de compleción se plantea: advertencia-

69voto

Quassnoi Puntos 191041

En SQL Server, estas declaraciones se producen el mismo de los planes.

Contrariamente a la opinión popular, en Oracle ellos lo hacen también.

SYS_GUID() en Oracle es bastante cómputo intensivo de la función.

En mi base de datos de prueba, t_even es una tabla con 1,000,000 filas

Esta consulta:

SELECT  COUNT(SYS_GUID())
FROM    t_even

pistas para 48 segundos, ya que la función debe evaluar cada uno de los SYS_GUID() vuelto a hacer seguro de que no es un NULL.

Sin embargo, esta consulta:

SELECT  COUNT(*)
FROM    (
        SELECT  SYS_GUID()
        FROM    t_even
        )

corre, pero 2 segundos, ya que doen siquiera se trata de evaluar SYS_GUID() (a pesar * siendo el argumento COUNT(*))

54voto

Tony Andrews Puntos 67363

Claramente, COUNT (*) y COUNT (1) siempre devolverá el mismo resultado. Por lo tanto, si uno fuera más lento que el otro sería eficaz debido a un error de optimizador. Dado que ambas formas se utilizan con mucha frecuencia en las consultas, que no tendría ningún sentido para un DBMS para permitir un error tal de permanecer sin fijar. Por lo tanto, usted encontrará que el rendimiento de las dos formas es idéntico en todas las principales bases de datos SQL.

20voto

onedaywhen Puntos 24594

En el Estándar SQL-92, COUNT(*) significa específicamente "la cardinalidad de la tabla de la expresión" (podría ser una tabla de base, la VISTA, la tabla derivada, CTE, etc.).

Supongo que la idea era que COUNT(*) es fácil de analizar. El uso de cualquier otra expresión que requiere el analizador para asegurarse de no hacer referencia a columnas (COUNT('a') donde a es un literal y COUNT(a) donde a es una columna, puede producir resultados diferentes).

En la misma vena, COUNT(*) puede ser fácilmente recogidos a cabo por un ser humano coder familiarizado con el estándar SQL, una habilidad útil cuando se trabaja con más de un proveedor de SQL de la oferta.

También, en el caso especial SELECT COUNT(*) FROM MyPersistedTable;, el pensamiento es el DBMS es probable que mantenga las estadísticas para la cardinalidad de la tabla.

Por lo tanto, debido COUNT(1) y COUNT(*) son semánticamente equivalentes, utilizo COUNT(*).

12voto

Richard Puntos 54016

Yo esperaría que el optimizador para asegurar que no hay diferencia real fuera de casos extremos extraños.

Como con cualquier cosa, la única manera verdadera de decir es medir sus casos concretos.

Dicho esto, yo siempre he usado COUNT(*) .

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X