2009-08-19 6 views

答えて

7

あなたはthisような何かを試みることができる:これはROW_COUNT、col_countを返します

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

+2

Gah、ugly join構文:( –

+3

)sysobjectsとsysindexesシステムテーブルをもう使用しないでください!間もなく廃止され、SQL Server 2005には必要なすべてのビューsysを持つ新しい "sys"スキーマが導入されました。テーブル、sys.indexesなど - 代わりにそれらを使用してください! –

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スキーマにないテーブルで今までに働いた唯一のものです –

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

なぜ複雑なのですか? –

+0

あなたがそれを実行した場合、多くのテーブルがブロックされる可能性があります。 –

+0

@marc_s、thsiは推定値ではなく実際のテーブルの数を返します。 –

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; 
関連する問題