Obtener conteos aproximados de todas las tablas

Señal o problema observado

Queremos reconocer rápidamente cuáles tablas están vacías, cuáles tienen miles de filas y cuáles dominan el volumen de la base. Ejecutar COUNT(*) sobre cada tabla puede ser innecesariamente costoso para una primera exploración.

Qué necesitamos distinguir

Una partición es una porción de almacenamiento de una tabla o índice. La estimación suma sus conteos internos sin leer cada fila de la tabla.

Buscamos una estimación obtenida desde estadísticas internas de particiones. Para no contar la misma fila una vez por cada índice, sumaremos únicamente el heap o índice clustered de cada tabla.

Un heap es una tabla sin índice clustered. En una tabla con índice clustered, el nivel hoja de ese índice contiene las filas de la tabla; un índice nonclustered es una estructura separada que conserva sus propias entradas y localizadores hacia esas filas. Por eso no debemos sumar todos los índices como si cada uno representara datos distintos.

Consulta

SELECT
    s.name AS Esquema,
    t.name AS Tabla,
    SUM(COALESCE(ps.row_count, 0)) AS FilasAproximadas
FROM sys.tables AS t
INNER JOIN sys.schemas AS s
    ON s.schema_id = t.schema_id
LEFT JOIN sys.dm_db_partition_stats AS ps
    ON ps.object_id = t.object_id
   AND ps.index_id IN (0, 1)
WHERE t.is_ms_shipped = 0
GROUP BY
    s.name,
    t.name
ORDER BY
    FilasAproximadas DESC,
    s.name,
    t.name;

Parámetros o permisos

Una DMV es una vista de administración dinámica que expone estado y contadores internos del motor.

La consulta trabaja sobre la base actual. La vista de administración dinámica (DMV) expone contadores internos que pueden cambiar mientras el motor trabaja. En SQL Server 2019 y versiones anteriores requiere normalmente VIEW DATABASE STATE y VIEW DEFINITION. En SQL Server 2022 y posteriores, los permisos aplicables incluyen VIEW DATABASE PERFORMANCE STATE y VIEW SECURITY DEFINITION.

Los conteos se basan en información almacenada o mantenida internamente. No bloqueamos cada tabla para producir una fotografía transaccional exacta.

Cómo leer el resultado

FilasAproximadas suma las particiones del almacenamiento base. index_id = 0 representa un heap y index_id = 1, un índice clustered. Excluimos índices nonclustered porque contienen sus propias filas y duplicarían el conteo lógico de la tabla.

Una tabla con cero filas puede ser nueva, temporal desde la perspectiva funcional, usada solo en ciertos periodos o realmente obsoleta. El conteo no explica su finalidad.

Para una comprobación exacta de una tabla concreta, cuando el costo sea aceptable, utiliza:

SELECT COUNT_BIG(*) AS FilasExactas
FROM dbo.Pedido;

Qué conclusión sí permite obtener

Permite comparar rápidamente el orden de magnitud de las tablas y encontrar candidatas para una investigación de volumen, crecimiento o ausencia de datos.

Qué conclusión todavía no permite obtener

Una fotografía transaccional representa los datos de un momento coherente. El nivel de aislamiento define qué cambios concurrentes puede observar una consulta mientras se obtiene.

No garantiza un conteo exacto y consistente con todas las transacciones concurrentes. Tampoco mide tamaño en disco: pocas filas con columnas grandes pueden ocupar más espacio que millones de filas estrechas.

Las tablas optimizadas para memoria y otras estructuras especializadas pueden requerir vistas específicas para interpretar correctamente su almacenamiento.

Siguiente comprobación razonable

Mide el espacio utilizado por cada tabla. Si una cifra concreta determina una decisión, ejecuta un conteo exacto sobre esa tabla y considera su costo, concurrencia y nivel de aislamiento.

Índice del recorrido

Desarrollo y exploración

22 artículos de Desarrollo y exploración
  1. 01Buscar una tabla o vista por nombre
  2. 02Buscar una columna en toda la base
  3. 03Buscar texto dentro de procedimientos, vistas y funciones
  4. 04Consultar dependencias de un objeto
  5. 05Listar relaciones y llaves foráneas
  6. 06Consultar llaves primarias, restricciones únicas e índices
  7. 07Listar columnas con tipo, longitud, nulabilidad y valor predeterminado
  8. 08Encontrar triggers y sus tablas asociadas
  9. 09Encontrar objetos modificados recientemente
  10. 10Obtener conteos aproximados de todas las tablas
  11. 11Medir el espacio utilizado por cada tabla
  12. 12Revisar columnas IDENTITY y su valor actual
  13. 13Detectar registros duplicados por una clave de negocio
  14. 14Detectar registros huérfanos
  15. 15Comparar dos conjuntos de datos
  16. 16Validar conversiones antes de modificar una columna
  17. 17Ejecutar un UPDATE con validación y reversión controlada
  18. 18Ejecutar un DELETE con respaldo lógico y reversión controlada
  19. 19Comparar la estructura de dos bases de datos
  20. 20Describir el resultado de una consulta o procedimiento
  21. 21Encontrar tablas sin llave primaria
  22. 22Buscar un valor en columnas seleccionadas