Geeks•ms
Todo lo que los geeks de Windows y .Net tienen que contar
Sigue a Plain Concepts en Facebook
[Code] Conteo de Filas de cada una de las tablas de la base de datos

MVP

Código QR

Syndication

MCS Specialist

Red de Conocimiento

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,

FREDY LEANDRO ANGARITA CASTELLANOS
Sql Server MVP


Enviado 5/1/2012 20:20 por Freddy Angarita
Comparte este post:

Comentarios

MVP Factor escrito Agenda MVP (del 24 al 29 de Enero 2012)
en 24/1/2012 17:20

Agenda 24 enero, 2012 Sharing the Poing, South America 2012 Evento en Latinoamérica

Sigue a Plain Concepts en Facebook