2009-08-19 53 views

回答

7

你可以尝试像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

完美的工作......谢谢。 – Patrick 2009-08-19 13:35:40

+2

Gah,丑陋的加入语法:( – 2009-08-19 13:37:34

+3

不再使用sysobjects和sysindexes系统表 - 它!它们很快就会被弃用,并且SQL Server 2005引入了具有所有必要视图 - sys的新的“sys”模式。表,sys.indexes和更多 - 使用这些,而不是! – 2009-08-19 13:37:51

4

Galwegian得到它差不多吧:-)对于SQL Server 2005和起来,我总是使用推荐“SYS。*”系统视图,而不是(即将弃用)的sysobjects和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 

马克

0

我不记得在那里我得到了这一点,我敢肯定我没有写它,它肯定是矫枉过正,但它仍然是乐趣。

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

这里是我的版本,它采用了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

这是唯一一个工作到目前为止没有dbo架构表 – 2014-07-30 16:11:22

0

试试这个:

创建表:

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

运行此并复制输出:

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

运行复制的输出,将其插入到表中的行数为每个表

现在运行此,列出了它们的行的表数:

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

为什么如此复杂?? – 2009-08-19 13:40:33

+0

哇,可能会造成很多表阻塞,如果你运行它作为读提交 – 2009-08-19 13:42:17

+0

@marc_s,thsi返回实际表计数,而不是估计 – 2009-08-19 13:43:20

0

如果在数据库运行,以下返回表行数和索引/总空间使用情况。

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;