列出所有数据库上所有表的表大小

Cyl*_*ric 8 sql-server

是否有一种简单的方法可以列出 MSSQL 服务器上每个数据库中每个表的大小?

我使用了对 sys.tables 的查询来获取单个数据库的结果,但我们每个服务器有 100 个以上的数据库,因此获得相同结果但适用于所有数据库的方法会很棒。

目前,我必须从 master.sys.databases 创建一个临时数据库列表,然后使用游标对其进行迭代,构建查询并将结果插入到带有EXEC sp_executeSQL @SQLString.

小智 7

如果您想在您的所有环境中为您的所有数据库实现这一点……并且您不介意使用 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}}
    }
}
Run Code Online (Sandbox Code Playgroud)

正如DataSpaceUsed在“KB”中标记的SMO 对象输出,您可以将其修改为您选择的度量,只需为其添加缩写参考即可。所以如果我想要 "MB": $_.DataSpaceUsed/1MB.

在函数中([string[]]$server),括号“[]”表示参数接受一个对象数组。因此,如果您在文件中列出了服务器,则可以像这样调用该函数:


$list = get-content .\ServerList.txt
Get-TableSize -server $list | Out-GridView
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用Out-GridView最初来查看输出,它可以轻松地直接复制到 Excel 中。如果需要,您还可以将其输出到 PowerShell 的其他支持格式。

截图示例,您也可以只列出服务器: 在此处输入图片说明


小智 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
Run Code Online (Sandbox Code Playgroud)