是否有一种简单的方法可以列出 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)
归档时间: |
|
查看次数: |
43017 次 |
最近记录: |