sp_spaceused 如何计算具有 BLOB/溢出/行外类型的表的大小?

Posted

技术标签:

【中文标题】sp_spaceused 如何计算具有 BLOB/溢出/行外类型的表的大小?【英文标题】:How does sp_spaceused calculate the size of tables with BLOB / overflow / out-of-row types? 【发布时间】:2018-06-17 04:11:01 【问题描述】:

我的要求是计算我的 SQL Server 数据库中的表大小。

为此,我使用了预定义的 SP,sp_spaceused。但是,如果我的表中有 BLOB 类型的列(如 varbinary(max)FILESTREAM varbinary(max)),大小是如何计算的?

案例1:如果表有varbinary(max)列,大小是否包含二进制数据?

案例2:如果表包含FILESTREAM varbinary(max)类型列,那么大小是否包含二进制数据?出现这种情况是因为这里的二进制数据存储在 Windows 文件系统中。

你能帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

我认为dba stackexchange 会更好地回答您的问题。但是,我使用以下 SQL 命令来获取表大小:

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

它适用于 CASE 1,但是我不确定第二种情况。

【讨论】:

感谢@RadimBaca!您的查询对我有用。我也一定会在 DBA 堆栈交换论坛上发布这个......

以上是关于sp_spaceused 如何计算具有 BLOB/溢出/行外类型的表的大小?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server使用sp_spaceused查看表记录存在不准确的情况

sqlserver sp_spaceused用法

SQLServer中系统存储过程sp_spaceused

SQLServer中系统存储过程sp_spaceused

如何使用 .NET v12 SDK 在 Azure Blob 存储中上传具有指定 ContentType 的 Blob?

SQL Server中sp_spaceused统计数据使用的空间总量不正确的原因