sql >> Base de Datos >  >> RDS >> Sqlserver

Rendimiento de conteo SQL (*)

Mikael Eriksson tiene una buena explicación a continuación por qué la primera consulta es rápida:

El servidor SQL lo optimiza 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 usará el no agrupado más estrecho índice para contar las filas. Si la tabla no tiene ningún índice no agrupado, tendrá que escanear la tabla.

Además, si su tabla tiene un agrupado index puede obtener su conteo aún más rápido usando la siguiente consulta (tomada de este sitio ¡Obtener conteos de filas rápido!)

--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

Utiliza la tabla del sistema sysindexes. Puede encontrar más información aquí SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2012

Aquí hay otro enlace ¿Por qué mi SELECT COUNT (*) funciona tan lento? con otra solución. Muestra la técnica que usa Microsoft para mostrar rápidamente el número de filas cuando hace clic derecho en la tabla y selecciona 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 regresa muy rápidamente sin importar cuántas mesas tenga.

Si está usando 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 fuera de lugar dependiendo de la frecuencia con la que SQL actualice la tabla sysindexes, pero generalmente es correcto (o al menos lo suficientemente cercano).