2009-08-19 7 views

Répondre

7

Vous pouvez essayer quelque chose comme this:

SELECT 
    [TableName] = so.name, 
    [RowCount] = MAX(si.rows) 
FROM 
    sysobjects so, 
    sysindexes si 
WHERE 
    so.xtype = 'U' 
    AND 
    si.id = OBJECT_ID(so.name) 
GROUP BY 
    so.name 
ORDER BY 
    2 DESC 
+0

Cela fonctionne parfaitement ... merci. – Patrick

+2

Gah, syntaxe de jointure moche: ( –

+3

ne plus utiliser les tables système sysobjects et sysindexes - s'il vous plaît! Ils seront bientôt obsolètes, et SQL Server 2005 introduit le nouveau schéma "sys" qui a toutes les vues nécessaires - sys. tables, sys.indexes et plus - utilisez-les à la place! –

4

Galwegian got it :-) presque droit pour SQL Server 2005 et, j'ai toujours recommanderions à l'aide des "sys. *" Vues système au lieu des (bientôt) dépréciés sysobjects et sysindexes tables.

SELECT 
    t.NAME AS 'Table Name', 
    SUM(p.[Rows]) as 'Row Count' 
FROM 
    sys.tables t 
INNER JOIN  
    sys.indexes i ON t.OBJECT_ID = i.object_id 
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
WHERE 
    t.NAME NOT LIKE 'dt%' AND 
    i.OBJECT_ID > 255 AND 
    i.index_id = 1 
GROUP BY 
    t.NAME 
ORDER BY 
    SUM(p.[Rows]) DESC 

Marc

0

Je ne me souviens pas où je suis arrivé, je suis assez sûr que je n'ai pas écrit et il est certainement exagéré, mais il est toujours amusant.

USE master 
GO 

SET NOCOUNT ON 

DECLARE @EnumDBs TABLE ([id] INT IDENTITY, [sql] VARCHAR(1024), PRIMARY KEY ([id])) 
CREATE TABLE #EnumTables ([id] INT IDENTITY, [db] SYSNAME, [owner] SYSNAME, [table] SYSNAME, PRIMARY KEY ([db], [owner], [table], [id])) 
CREATE TABLE #TableMetrics ([id] INT IDENTITY, [db] SYSNAME NULL, [table] SYSNAME, [rows] INT, [reserved] VARCHAR(256), [data] VARCHAR(256), [index_size] VARCHAR(256), [unused] VARCHAR(256), PRIMARY KEY ([table], [id])) 

DECLARE @i INT 
DECLARE @sql VARCHAR(1024) 
DECLARE @db SYSNAME 

INSERT INTO @EnumDBs 
SELECT ' USE ['+name+'] 
     DBCC UPDATEUSAGE(0) WITH NO_INFOMSGS 
     INSERT INTO #EnumTables 
     SELECT '''+name+''' AS [db] 
       , u.name AS [owner] 
       , o.name AS [table] 
     FROM sysobjects AS o 
     JOIN sysusers AS u 
     ON o.uid = u.uid 
     WHERE type = ''U'' 
     ORDER BY u.name 
       , o.name' AS [sql] 
FROM master.dbo.sysdatabases WITH (NOLOCK) 
WHERE dbid > 4 

SELECT @i=COUNT(*) 
    , @sql='' 
FROM @EnumDBs 
WHILE @i > 0 
BEGIN 

    SELECT @sql = SQL 
    FROM @EnumDBs 
    WHERE ID = @i 

    IF @@ROWCOUNT > 0 
     EXEC(@sql) 

    IF (@@ERROR <> 0) GOTO ERR_HANDLER 

    SET @[email protected] 
END 

SELECT @i=COUNT(*) 
    , @sql='' 
FROM #EnumTables 

WHILE @i > 0 
BEGIN 

    SELECT @db=[db] 
     , @sql='USE ['+[db]+'] EXEC SP_SPACEUSED ''['+[db]+'].['+[owner]+'].['+[table]+']''' 
    FROM #EnumTables 
    WHERE ID = @i 

    --PRINT @SQL 
    INSERT INTO #TableMetrics 
    ([table], [rows], [reserved], [data], [index_size], [unused]) 
    EXEC(@sql) 
    IF (@@ERROR <> 0) GOTO ERR_HANDLER 

    UPDATE #TableMetrics 
     SET [db][email protected] 
    WHERE [db] IS NULL 
    IF (@@ERROR <> 0) GOTO ERR_HANDLER 

    SET @[email protected] 
END 

SELECT * FROM #TableMetrics ORDER BY [db], CAST(REPLACE([reserved],' KB','') AS INT) DESC 

ERR_HANDLER: 
DROP TABLE #EnumTables 
DROP TABLE #TableMetrics 
1

voici ma version qui utilise une dm_db_partition_stats DMV:

SELECT object_name(object_id) as table_name, 
    SUM (row_count) AS total_number_of_rows 
FROM sys.dm_db_partition_stats 
WHERE (index_id=0 or index_id=1) 
group by object_name(object_id) 
order by SUM (row_count) desc 
+0

Ceci est le seul qui a fonctionné jusqu'à présent avec des tables pas dans le schéma dbo –

0

essayez ceci:

create table:

create table maxRows (tablename varchar(900) primary key,CountOf int) 

Exécuter ce et copiez la sortie:

EXEC sp_msforeachtable 'print ''INSERT INTO maxRows SELECT ''''?'''', COUNT(*) FROM ? WITH (NOLOCK)''' 

jamais la sortie copié, il insère dans la table une ligne compte pour chaque table

Lancez maintenant ce, énumère les tables avec leur nombre de lignes:

select countOf,tablename from maxRows order by CountOf DESC 
+0

pourquoi si compliqué? –

+0

wow, pourrait causer beaucoup de blocage de la table si vous l'exécutez comme lu engagé –

+0

@marc_s, thsi renvoie le nombre réel de la table, pas d'estimations –

0

Lorsqu'il est exécuté dans une base de données, ce qui suit renvoie le nombre de lignes de la table et l'utilisation de l'index/de l'espace total.

declare @tableName varchar(100); 

create table 
    #table 
    (
     tablename sysname, 
     row_count int, 
     reserved varchar(50), 
     data  varchar(50), 
     index_size varchar(50), 
     unused  varchar(50) 
    ); 

create table 
    #table2 
    (
     tableName varchar(100), 
     row_count int, 
     data_size int, 
     index_size int, 
     reserved int, 
     unused  int 
    ); 

declare C_T cursor fast_forward for 
    select  TableName = '[' + s.name + '].[' + t.name + ']' 
    from  sys.tables t 
       inner join sys.schemas s on t.schema_id = s.schema_id 
    where  t.type = 'U' 
    order by s.name, 
       t.name; 

open C_T; 

fetch next from C_T into @tableName; 

while @@FETCH_STATUS = 0 
    begin 
     truncate table #table; 

     insert into #table 
     exec  sp_spaceused @tableName, false; 

     insert into #table2(tableName, row_count, data_size, index_size, reserved, unused) 
     select  @tableName, 
        row_count, 
        convert(int, replace(data, ' KB', '')), 
        convert(int, replace(index_size, ' KB', '')), 
        convert(int, replace(reserved, ' KB', '')), 
        convert(int, replace(unused, ' KB', '')) 
     from  #table; 

     fetch next from C_T into @tableName; 
    end 

close  C_T; 
deallocate C_T; 

select  [Table Name] = tableName, 
      [Rows] = row_count, 
      [Data Size (KB)] = data_size, 
      [Indexes Size (KB)] = index_size, 
      [Reserved Space (KB)] = reserved, 
      [Unused Space (KB)] = unused 
from  #table2 
order by data_size desc; 

drop table  #table; 
drop table  #table2; 
Questions connexes