2011-08-19 26 views
12

Duplicar posibles:
Count(*) vs Count(1)SQL Mejor Práctica: count (1) o el recuento (*)

que anecdóticamente recuerdo que me dijeron:

nunca use count (*) cuando el recuento (1) sea

Recientemente pasé este consejo a otro desarrollador, y tuve el desafío de probar que esto era cierto. Mi argumento fue lo que me dijeron junto con cuando me dieron el consejo: que la base de datos solo devolvería la primera columna, que luego se contabilizaría. El argumento en contra fue que la base de datos no evaluaría nada entre corchetes.

De algunas pruebas (no científicas) en tablas pequeñas, ciertamente no parece haber diferencia. Actualmente no tengo acceso a ninguna tabla grande para experimentar.

Me dieron este consejo cuando estaba usando Sybase, y las tablas tenían cientos de millones de filas. Ahora estoy trabajando con Oracle y considerablemente menos datos.

así que supongo que en resumen, mis dos preguntas son:

  1. que es más rápido, count (1) o contar (*)?
  2. ¿Esto varía en diferentes proveedores de bases de datos?
+1

1. ANSI SQL define 'COUNT (*)' debe optimizarse 2. Esto se aplica a la mayoría de RDBMS. Cualquier otra cosa se aplica solo a las versiones anteriores * donde se indica * de lo contrario se supone que COUNT (*) está optimizado. – gbn

Respuesta

13

Según otra pregunta similar (Count(*) vs Count(1)), que son los mismos.

En Oracle, de acuerdo con Ask Tom, el recuento (*) es la forma correcta de contar el número de filas porque el optimizador cambia el recuento (1) a contar (*). contar (1) en realidad significa contar filas con 1 no nulo (ninguno de ellos es nulo, por lo que el optimizador lo cambiará).

+0

+1 para agregar el enlace de Oracle – gbn

-3
  1. recuento (1)
  2. No, hablando en términos generales esto siempre tendrá un mejor rendimiento.

Solo afectaría si aumentara la escala a una cantidad drástica, pero es una buena práctica.

+3

no y no. Mitos. -1. Además de ser un duplicado, tienes esto en [DBA.SE] (http://dba.stackexchange.com/questions/2511/what-is-the-difference-between-select-count-and-select-countany -non-null-col/2512 # 2512) – gbn

+1

No creo que sea correcto hacer la afirmación general de que contar (1) siempre tendrá un rendimiento ligeramente mejor. – hatchet

+2

¿Tiene alguna documentación para apoyar esta violación de la sabiduría convencional? – dkretz

4

Al leer libros específicamente en TSQL y Microsoft SQL Server, he leído que usar * es mejor porque le permite al optimizador decidir qué es lo mejor para hacer. Trataré de encontrar los nombres de los libros específicos y publicarlos aquí.

+0

Esto también se aplica al uso de "existe (seleccione * de ...)" versus "existe (seleccione el campo de ...)" –

+0

'count (*)' es una locución bastante común que cualquier optimizador debería tenerlo en cuenta, no solo SQL Server. Desearía tener evidencia para respaldar eso. –

+0

@Mark Ransom: en el estándar ANSI http://dba.stackexchange.com/questions/2511/what-is-the-difference-between-select-count-and-select-countany-non-null-col/2512 # 2512 – gbn

3

Este es un patrón de consulta básico, y el significado es idéntico. He leído más de una vez que el optimizador los trata de manera idéntica; no puedo encontrar una referencia específica en este momento, pero los coloco en la categoría de "conocimiento institucional".

(debería haber buscado primero ... http: //stackoverflow.com/questions/1221559/count-vs-count1)

1

Por lo que yo sepa con recuento () debe ser más rápido, porque cuando eso función se llama el motor cuenta solo índices. Desde otro punto de vista, probablemente tanto el recuento () como el recuento (1) en código binario se vean muy similares, por lo que no debería haber diferencia.

2

Solo puedo hablar con SQL Server, pero probando en una tabla de 5 GB, registros de 11 mm: tanto el número de lecturas como el plan de ejecución fueron idénticos.

Yo diría que no hay diferencia.