2009-08-19 5 views

Antwort

7

Man könnte so etwas wie this versuchen:

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

Das funktioniert perfekt ... danke. – Patrick

+2

Gah, hässliche Join-Syntax :( –

+3

Verwenden Sie die Systemtabellen sysobjects und sysindexes nicht mehr - bitte! Sie werden bald veraltet sein und SQL Server 2005 führte das neue Schema "sys" ein, das alle erforderlichen Views - sys enthält. Tabellen, sys.indexes und mehr - verwenden Sie diese stattdessen! –

4

Galwegian habe es fast richtig :-) Für SQL Server 2005 und höher, ich recommed immer die Verwendung von "sys. *" Systemansichten statt die (bald veraltet sein) sysobjects und Tabellen sysindexes.

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

Ich kann mich nicht erinnern, wo ich diese bekam, ich bin ziemlich sicher, dass ich es nicht schreiben und es ist definitiv übertrieben, aber es ist immer noch Spaß.

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

hier ist meine Version, die eine dm_db_partition_stats DMV verwendet:

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

Dies ist der einzige, der bisher mit Tabellen nicht im dbo-Schema –

0

try this:

create table:

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

laufen diese und kopieren Sie die Ausgabe:

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

den kopierten Ausgang laufen, ihn in die Tabelle fügt eine Zeile für jede Tabelle zählen

jetzt laufen diese, listet die Tabellen mit ihren Zeilenanzahl:

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

warum so kompliziert gearbeitet? –

+0

wow, könnte eine Menge Blockierung der Tabelle verursachen, wenn Sie es als gelesen ausgeführt ausführen –

+0

@marc_s, thsi gibt die tatsächliche Anzahl der Tabellen zurück, nicht Schätzungen –

0

Wenn in einer Datenbank ausführen, die folgende Gibt die Zeilenanzahl der Tabelle und den Index/die gesamte Speicherplatzbelegung zurück.

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; 
Verwandte Themen