2010-07-01 16 views
5

Duplicar posibles:
Performance of COUNT SQL functiones el recuento (columna indexada) más rápido que el recuento (*)?

Hola a todos, tengo tablas muy grandes y necesito saber el número de registros en cada uno, Mi pregunta es ¿reduce el tiempo de ejecución si funciono:

select count(indexed column like my PK) from tbTest 

en lugar de

select count(*) from tbTest 
+0

para ser honesto No encontré esa pregunta, pero creo que mi pregunta es un poco diferente porque se trata de la columna indexada: D gracias – Asha

Respuesta

0

es más probable, si la consulta escanea el índice en lugar de toda la tabla.

es algo fácil de probar, conviértase en su propio científico.

6

ver Performance of COUNT SQL function

Lo importante a destacar es que no son equivalentes

+0

Pensé que esto se había preguntado antes.;) – NotMe

+0

Esta pregunta en el enlace se refiere a some_column_name pero esta pregunta es para count (indexed_column) ... por lo que será el mismo – Baaju

+1

@Baaju, hay columnas indexadas además del PK. –

-1

Ambos son idénticos. Si mira el plan de ejecución de consultas para ambos, ambos harán un "escaneo de índice"

+0

Solo son idénticos si la columna seleccionada es PK, ya que COUNT (*) usará el índice PK. –

+0

¡Sí! La pregunta se refiere a la columna Pk indexada. ¡Entonces deben ser idénticos! :) – Baaju

1

Dado que la pregunta es si existe o no una diferencia de rendimiento, dependerá del índice. Cuando haga COUNT (*), usará la (s) columna (s) PK para determinar el número de filas. Si no tiene ningún índice además de un índice agrupado en la (s) columna (s) PK, escaneará los nodos hoja en el índice agrupado. Eso es probablemente muchas páginas. Si tiene un índice no agrupado más delgado que el índice agrupado, lo elegirá, lo que dará como resultado menos lecturas.

Por lo tanto, si la columna que selecciona está contenida en el índice no agrupado más pequeño posible de la tabla, el optimizador de consultas SQL lo elegirá para ambos conteos () (si tiene un ix agrupado que es PK) y count (indexed_column). Si elige un recuento (indexed_col) que solo está contenido en un índice amplio, el recuento () será más rápido si su PK es un índice agrupado. El motivo por el que esto funciona es que hay un puntero al índice agrupado en todos los índices no agrupados y SQL Server puede calcular el número de filas basadas en ese índice no agrupado.

Por lo tanto, como es habitual en SQL Server, depende. Haga un showplan y compare las consultas entre sí.

+1

En otras palabras. Lo mejor que puedes hacer es obtener la misma velocidad con 'count (indexed not null column) from tab' Y posiblemente peor. (A menos que las estadísticas estén masivamente fuera de control). Y con count (*), el optimizador de consultas puede cambiar su plan en caso de que se agreguen nuevos índices mejores. –

0

SELECT COUNT(*)may sea más rápido. Eso es porque usar * le da al optimizador libertad para elegir cualquier columna con la que contar. Supongamos que tiene una clave principal en una columna INT y una clave no agrupada en una columna bigint diferente. Pero la clave principal es probablemente el agrupado en el índice, y como tal, de hecho es significativamente más grande que el índice bigint no agrupado (tiene más páginas). Entonces, si el optimizador es libre de elegir el índice bigint no agrupado, puede devolver la respuesta más rápido. Posible mucho más rápido, dependiendo de la tabla.

Así que, en general, siempre es mejor dejarlo como COUNT(*) y dejar que el optimizador elija.

Cuestiones relacionadas