Conteo de Filas de cada tabla
Haciendo diagnóstico de las bases de datos, realizando seguimientos al crecimiento del número de registros y en fin para conocer el número de registros en todas las tablas existen varias técnicas pero existen unas mejores que otras y a contiuación se presentarán:
Una de las aproximaciones es usar uno de los procedimientos almacenados más prácticas que tiene TSql sp_MSforeachtable la cual nos permite ejecutar algún tipo de instrucción para cada una de las tablas de la base de datos, incluso admite filtros
exec sp_MSforeachtable 'select ''?'' TableName, count(*) Cnt from ?';
El asunto con esta solución es que se genera un resultset para cada una de las tablas (es decir, no es un solo resultado, sino uno por cada tabla) lo cual para cosas como un reporte son complicadas de manejar.
Entonces la siguiente aproximación sería desarrollar un procedimiento almacenado que genere la consulta y luego la una y me presente un solo resultado, algo como:
declare @tempTable table ( TableSchema nvarchar(256), TableName nvarchar(256), Cnt bigint ); declare @sql nvarchar(4000); declare @tableSchema nvarchar(256); declare @tableName nvarchar(256); declare @columnName sysname; declare @cnt bigint; declare tableCursor cursor for select TABLE_SCHEMA, TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'; open tableCursor; fetch next from tableCursor into @tableSchema, @tableName; while @@FETCH_STATUS = 0 begin set @sql = 'select @cnt = COUNT(*) from [' + @tableSchema + '].[' + @tableName + ']'; exec sp_executesql @sql, N'@cnt bigint output', @cnt = @cnt output; insert into @tempTable select @tableSchema, @tableName, @cnt; fetch next from tableCursor into @tableSchema, @tableName; end; close tableCursor; deallocate tableCursor; select * from @tempTable;
Por supuesto esta solución tiene varios inconvenientes, para empezar usa un cursor para leer el listado de tablas de la consulta estandar INFORMATION_SCHEMA, segundo usa un sql dinámico para armar poco a poco la consulta que se desea ejecutar y algo que no se ve a simple vista y es la necesidad de ejecutar COUNT para cada una de las tablas, por lo cual ésta no es la solución adecuada tampoco
Ahora veremos cómo podemos encontrar el conteo y de paso saber cual es la tabla que cuenta con mayor cantidad de registros
Sql 2000 | Sql 2005+ |
SELECT OBJECT_NAME(id),rowcnt FROM SYSINDEXES WHERE OBJECTPROPERTY(id,’isUserTable’)=1 AND indid < 2 ORDER BY rowcnt DESC |
select sc.name +'.'+ ta.name ,sum(pa.rows) -- Valor aproximado from sys.tables ta inner join sys.partitions pa on pa.object_id = ta.object_id inner join sys.schemas sc on ta.schema_id = sc.schema_id where ta.is_ms_shipped = 0 AND pa.index_id IN (1,0) group by sc.name,ta.name ORDER BY sum(pa.rows) DESC |
Sql Server crea estadísticas para cada tabla lo que le permite optimizar las consultas que ejecutamos por lo que podemos usar estas estadísticas para obtener éste dato, también, analizar la consulta, observamos que se tiene en cuenta si la tabla está particionada y asimismo se consideran los esquemas para que la información quede completa
Espero sea de ayuda,
Agenda 24 enero, 2012 Sharing the Poing, South America 2012 Evento en Latinoamérica