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

4 formas de contar filas en la tabla de SQL Server con pros y contras

Recientemente, estaba trabajando en un proyecto de mejora del rendimiento de la base de datos. Un procedimiento almacenado allí estaba causando problemas. En su código, una consulta llenó el recuento de filas y almacenó el valor en una variable local. Esa consulta estaba escaneando una tabla grande. Debido a eso, la utilización de recursos se volvió significativamente mayor. Para solucionar el problema, eliminamos el código defectuoso y usamos las vistas del catálogo de SQL Server para generar el recuento de filas de la tabla.

Hay varias formas de contar el número de filas en una tabla de SQL Server. Este artículo los describirá para que elijas siempre la forma correcta de hacerlo.

Podemos obtener el Conteo de filas de la tabla con cualquiera de los siguientes métodos:

  1. Utilice la función COUNT().
  2. Combinando vistas de catálogo de SQL Server.
  3. Uso de sp_spaceused procedimiento almacenado.
  4. Utilizando el estudio de administración de SQL Server.

Profundicemos más.

Obtenga el recuento de filas usando COUNT(*) o Count(1)

Podemos usar la función COUNT(*) o COUNT(1) – los resultados generados por estas dos funciones son idénticos.

Para obtener el recuento de filas, primero ejecutemos la consulta usando COUNT (*). Para fines de demostración, he establecido el valor de STATISTICS IO como ON.

USE wideworldimporters 
go 

SELECT Count(*) 
FROM   tblcustomer 
go  

Salida:

Estadísticas de OI:

Table 'tblCustomer'. Scan count 1, logical reads 691, physical reads 315, page server reads 0, read-ahead reads 276, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.

Como puede ver, SQL Server tiene que realizar 691 lecturas lógicas para satisfacer el resultado.

Ahora, ejecutemos la consulta usando COUNT(1):

USE wideworldimporters 
go 

SELECT Count(1) 
FROM   tblcustomer 
go  

Salida:

Estadísticas de OI:

Table 'tblCustomer'. Scan count 1, logical reads 691, physical reads 687, page server reads 0, read-ahead reads 687, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.

Nuevamente, SQL Server debe realizar 691 lecturas lógicas para satisfacer el resultado.

Debemos mencionar que existe la opinión de que la función Count (1) es más rápida que la función Count (*). Sin embargo, como puede ver en los ejemplos anteriores, los conjuntos de resultados y las estadísticas de IO son los mismos. Por lo tanto, puede utilizar cualquier método para generar el recuento de filas de las tablas.

Pros:

La función COUNT rellena un número exacto de filas de la tabla.

Desventajas:

Cuando ejecuta la función COUNT, coloca un candado en la tabla. Otras consultas que acceden a la tabla tienen que esperar hasta que se genera el resultado. Si está trabajando en un sistema ocupado con una tabla que tiene millones de filas, es mejor que evite ejecutar la función COUNT durante el horario comercial, a menos que tenga que completar el número exacto de filas de la tabla.

Combinar vistas de catálogo de SQL Server

Podemos usar vistas de catálogo de SQL Server con las siguientes vistas de administración dinámica:

  1. sys.tablas – rellena la lista de tablas.
  2. sys.indexes – rellena la lista de índices de la tabla.
  3. sys.particiones – rellena las filas de cada partición.

Para obtener el recuento de filas, ejecute el siguiente script:

SELECT a.NAME, 
       c.NAME, 
       Sum(b.rows) 
FROM   sys.tables a 
       INNER JOIN sys.partitions b 
               ON a.object_id = b.object_id 
       INNER JOIN sys.indexes c 
               ON b.index_id = c.index_id 
                  AND b.object_id = c.object_id 
WHERE  a.object_id = Object_id('tblCustomer') 
       AND c.index_id < 2 

Salida:

La consulta rellena el nombre de la tabla , nombre de índice, y filas totales en todas las particiones.

Ahora, revisemos las estadísticas de IO:

Table 'syssingleobjrefs'. Scan count 3, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysidxstats'. Scan count 1, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysschobjs'. Scan count 0, logical reads 4, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysrowsets'. Scan count 2, logical reads 14, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.

Como puede ver, la consulta realiza solo 30 lecturas lógicas.

Pros:

Este enfoque es más rápido que la función COUNT. No adquiere un bloqueo en la tabla de usuarios, por lo que puede usarlo en un sistema ocupado.

Desventajas:

El método rellena un recuento aproximado de filas. En la documentación de Microsoft de sys.partitions, puede ver que las filas columna trae el número aproximado de filas para las particiones.

Por lo tanto, si está buscando una consulta que brinde el resultado más rápido que la función COUNT, puede usar esta. Sin embargo, el resultado puede ser inexacto.

Usar sp_spaceused

El sp_spaceused El procedimiento junto con el recuento de filas proporciona los siguientes detalles:

  1. Nombre – el nombre de la tabla
  2. Filas – el Conteo de las filas en una tabla.
  3. Reservado – el espacio total reservado para una mesa.
  4. Datos – el espacio total utilizado por la mesa.
  5. Tamaño_del_índice – el espacio total utilizado por el índice.
  6. Sin usar – el espacio total reservado para una mesa que no se utiliza.

La sintaxis es:

EXEC Sp_spaceused 'database_name.schema_name.table_name' 

La consulta:

EXEC Sp_spaceused 'WideWorldImportors.dbo.tblCustomer' 

Salida:

Usar SQL Server Management Studio

Para obtener el recuento de filas de la tabla, podemos usar el estudio de administración de SQL Server.

Abra SQL Server Management Studio> Conéctese a la instancia de la base de datos> Expandir tablas> Haga clic con el botón derecho en tblCustomer> Propiedades

En la Tabla Propiedades ventana, haga clic en Almacenamiento . Verá el Recuento de filas valor a la derecha:

Otra opción para obtener el número de filas en una tabla viene con el complemento SQL Complete SSMS. Con esta mejora, puede ver el número estimado de filas en una sugerencia cuando pasa el mouse sobre el nombre de una tabla en la ventana Explorador de objetos. De esta manera, puede obtener los datos necesarios en un modo visual sin ningún esfuerzo adicional.

Conclusión

Este artículo explicó diferentes enfoques para calcular el número total de filas de la tabla, en particular:

  1. Usando la función COUNT.
  2. Combinando diferentes vistas de catálogo.
  3. Uso de sp_spaceused procedimiento almacenado.
  4. Utilizando el estudio de administración de SQL Server.

No hay necesidad de ceñirse a un solo método. Cada variante tiene sus especificidades, y puedes aplicar la que mejor se adapte a tu situación.