すべてのデータベースのすべてのテーブルのテーブルサイズを一覧表示する


8

MSSQLサーバー上のすべてのデータベースのすべてのテーブルのサイズを一覧表示する簡単な方法はありますか?

1つのデータベースの結果を取得するためにsys.tablesでクエリを使用しましたが、サーバーごとに100を超えるデータベースがあるため、同じ結果を取得する方法はすべてのデータベースに対して素晴らしいでしょう。

現在、master.sys.databasesからデータベースの一時リストを作成し、それをカーソルで反復処理して、クエリを作成し、結果を一時テーブルにで挿入する必要がありますEXEC sp_executeSQL @SQLString


オブジェクト空間情報は、オブジェクトが存在するデータベースに保存されます。したがって、データベースのリストを使用して反復する方法は他にありません。SQL Serverのどのバージョンを使用していますか?
エドワードドートランド2013

@cylindric、ここに
Biju jose

回答:


6

これをすべての環境で、すべてのデータベースで取得したい場合、そしてPowerShellを使用してもかまいません...これは、少なくともSQL Server 2008 Management Studioがインストールされているマシンから実行する必要があります。


# Load SMO
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null

function Get-TableSize ([string[]]$server) {
    foreach ($srv in $server) {
        $s = New-Object 'Microsoft.SqlServer.Management.Smo.Server' $srv

        $s.Databases.Tables | 
            ? {-Not $_.IsSystemObject} | 
                Select @{Label="Server";Expression={$srv}},
                    @{Label="DatabaseName";Expression={$_.Parent}}, 
                    @{Label="TableName";Expression={$_.Name}}, 
                    @{Label="SizeKB";Expression={$_.DataSpaceUsed}}
    }
}

DataSpaceUsedSMOオブジェクト出力に「KB」のラベルが付けられているので、省略形の参照を置くだけで、これを変更して任意の測定値にすることができます。だから私は「MB」を望んだ場合:$_.DataSpaceUsed/1MB

関数([string[]]$server)では、角かっこ「[]」は、パラメータがオブジェクトの配列を受け入れることを意味します。したがって、サーバーがファイルにリストされている場合は、次のように関数を呼び出すことができます。


$list = get-content .\ServerList.txt
Get-TableSize -server $list | Out-GridView

Out-GridViewは最初に出力を確認することを好んでおり、Excelに直接簡単にコピーできます。必要に応じて、これをPowerShellの他のサポートされている形式に出力することもできます。

スクリーンショットの例、サーバーを一覧表示することもできます。 ここに画像の説明を入力してください


これはかなり完璧かもしれません。試してみるよ!
Cylindric

パーフェクト、ありがとう。認証を追加するだけで、必要な追加フィールドをTableオブジェクトtechnet.microsoft.com/en-us/library/…
Cylindric

5

Stack-Overflowから取得データベース内のすべてのテーブルのサイズを取得

SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
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
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
WHERE 
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    t.Name

1
それはまさに私が既に持っているものであり、私が必要とすることをしません-それはただ一つのデータベースを示しています。
Cylindric

2

以前の回答を組み合わせて使用​​しました:

USE [master];
GO

sp_msforeachdb 'USE [?]; 
SELECT  
''?'' as db,    
t.NAME AS TableName,    
s.Name AS SchemaName,    
p.rows AS RowCounts,    
SUM(a.total_pages) * 8 AS TotalSpaceKB,     
SUM(a.used_pages) * 8 AS UsedSpaceKB, 
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB 
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 
INNER JOIN     sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN     sys.schemas s ON t.schema_id = s.schema_id 
WHERE    p.rows > 0 AND t.is_ms_shipped = 0    AND i.OBJECT_ID > 255 
GROUP BY     t.Name, s.Name, p.Rows 
ORDER BY p.rows DESC' ;

1

sp_msforeachdbただし、これを使用していくつかの警告を試すことができます。

それは私が数年の間それを首尾よく使用してきたと言われています。

sp_msforeachdb 'USE [?]; SELECT * FROM sys.tables'

基本的には、カーソル上で置換を行い、?DB名。

Aaron Bertrandの代替バージョンを試すこともできます。 私はそれを自分で試したことはありませんが、もっと良いはずです。


0

以下はあなたの質問を解決します:

use master
DECLARE @xQry NVARCHAR(MAX)=''
SELECT @xQry+= ' UNION ALL SELECT '''+name+''' COLLATE Modern_Spanish_CI_AS AS [Database], 
    schema_name(tab.schema_id) + ''.'' + tab.name COLLATE Modern_Spanish_CI_AS AS [table], 
        cast(sum(spc.used_pages * 8)/1024.00 as numeric(36, 2)) as used_mb,
        cast(sum(spc.total_pages * 8)/1024.00 as numeric(36, 2)) as allocated_mb
    from '+name+'.sys.tables tab
    join '+name+'.sys.indexes ind 
         on tab.object_id = ind.object_id
    join '+name+'.sys.partitions part 
         on ind.object_id = part.object_id and ind.index_id = part.index_id
    join '+name+'.sys.allocation_units spc
         on part.partition_id = spc.container_id
    group by schema_name(tab.schema_id) + ''.'' + tab.name COLLATE Modern_Spanish_CI_AS'
FROM sys.databases 

SET @xQry= RIGHT(@xQry,LEN(@xQry)-11) + ' order by 3 desc'
EXEC (@xQry)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.