Mikael Eriksson tiene una buena explicación abajo por qué la primera consulta es rápida:
servidor SQL optimizarlo en: if exists(select * from BookChapters)
. Así que busca la presencia de una fila en lugar de contar todas las filas de la tabla.
Para las otras dos consultas, SQL Server usaría la siguiente regla. Para realizar una consulta como SELECT COUNT(*)
, SQL Server utilizará el índice no agrupado más pequeño para contar las filas. Si la tabla no tiene ningún índice no agrupado , tendrá que escanear la tabla.
Además, si la tabla tiene un índice agrupado puede obtener su recuento aún más rápido utilizando la siguiente consulta (tomado de este sitio Get Row Counts Fast!)
--SQL Server 2005/2008
SELECT OBJECT_NAME(i.id) [Table_Name], i.rowcnt [Row_Count]
FROM sys.sysindexes i WITH (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rowcnt desc
--SQL Server 2000
SELECT OBJECT_NAME(i.id) [Table_Name], i.rows [Row_Count]
FROM sysindexes i (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rows desc
Se utiliza la tabla de sistema sysindexes. Más información se puede encontrar aquí SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2012
Aquí hay otro enlace Why is my SELECT COUNT(*) running so slow? con otra solución. Muestra la técnica que utiliza Microsoft para mostrar rápidamente el número de filas al hacer clic derecho en la tabla y seleccionar propiedades.
select sum (spart.rows)
from sys.partitions spart
where spart.object_id = object_id(’YourTable’)
and spart.index_id < 2
Debería encontrar que esto vuelve muy rápido independientemente de la cantidad de tablas que tenga.
Si está utilizando SQL 2000 aún puede usar la tabla sysindexes para obtener el número.
select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)
Este número puede estar ligeramente desviado dependiendo de la frecuencia de SQL actualiza la tabla sysindexes, pero por lo general es Corrent (o al menos lo suficientemente cerca).
En términos generales, seleccione " recuento (*) de la tabla "- puede tener grandes problemas con datos más grandes;) –