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.