sp_spaceused (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

sp_spaceused系统存储过程显示以下任一项:

  • 当前数据库中表、索引视图或 Service Broker 队列使用的行数、保留磁盘空间和磁盘空间数

  • 整个数据库保留和使用磁盘空间

Transact-SQL 语法约定

语法

sp_spaceused
    [ [ @objname = ] N'objname' ]
    [ , [ @updateusage = ] 'updateusage' ]
    [ , [ @mode = ] 'mode' ]
    [ , [ @oneresultset = ] oneresultset ]
    [ , [ @include_total_xtp_storage = ] include_total_xtp_storage ]
[ ; ]

注意

Azure Synapse Analytics 中的无服务器 SQL 池不支持此语法。

参数

对于 Azure Synapse Analytics 和分析平台系统(PDW), sp_spaceused 必须指定命名参数(例如 sp_spaceused (@objname= N'Table1');),而不是依赖参数的序号位置。

[ @objname = ] N'objname'

为其请求空间使用情况信息的表、索引视图或队列的限定或非限定名称。 @objname为 nvarchar(776),默认值为 NULL. 仅当指定限定对象名称时,才需要使用引号。 如果提供完全限定对象名称(包括数据库名称),则数据库名称必须是当前数据库的名称。

如果未 指定@objname ,则返回整个数据库的结果。

注意

Azure Synapse Analytics 和分析平台系统(PDW)仅支持数据库和表对象。

[ @updateusage = ] 'updateusage'

指示 DBCC UPDATEUSAGE 应运行以更新空间使用情况信息。 @updateusage为 varchar(5),默认值为 false. 如果未指定@objname,该语句将在整个数据库上运行。 否则,该语句在@objname上运行。 值可以是 truefalse

[ @mode = ] 'mode'

指示结果的范围。 对于拉伸表或数据库, @mode 参数允许你包含或排除对象的远程部分。 有关详细信息,请参阅 Stretch Database

重要

SQL Server 2022 (16.x) 和 Azure SQL 数据库中已弃用 Stretch Database。 在数据库引擎的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

@mode为 varchar(11),可以是以下值之一。

说明
ALL(默认值) 返回对象或数据库的存储统计信息,包括本地部分和远程部分。
LOCAL_ONLY 仅返回对象或数据库的本地部分的存储统计信息。 如果对象或数据库未启用 Stretch,则返回与@modeALL相同的统计信息。
REMOTE_ONLY 仅返回对象或数据库的远程部分的存储统计信息。 如果满足以下条件之一,此选项将引发错误:

未为 Stretch 启用该表。

表已启用 Stretch,但从未启用数据迁移。 在这种情况下,远程表尚没有架构。

用户手动删除了远程表。

远程数据存档的预配返回成功状态,但实际上失败。

[ @oneresultset = ] oneresultset

指示是否返回单个结果集。 @oneresultset,可以是以下值之一:

说明
0(默认值) 当@objname为 null 或未指定时,将返回两个结果集。
1 当@objnameNULL未指定时,将返回单个结果集。

[ @include_total_xtp_storage = ] include_total_xtp_storage

适用于:SQL Server 2017 (14.x) 及更高版本,以及SQL 数据库

@oneresultset 设置为 1时,此参数确定单个结果集是否包含存储列 MEMORY_OPTIMIZED_DATA@include_total_xtp_storage,默认值为 0. 如果 1为 XTP 列,则包含在结果集中。

返回代码值

0(成功)或 1(失败)。

结果集

如果省略@objname0并且@oneresultset的值,则返回以下结果集以提供当前数据库大小信息。

列名称 数据类型 描述
database_name nvarchar(128) 当前数据库的名称。
database_size varchar(18) 当前数据库的大小 (MB)。 database_size 包括数据和日志文件。
unallocated space varchar(18) 数据库中未为数据库对象保留的空间。
列名称 数据类型 描述
reserved varchar(18) 由数据库中对象分配的空间总量。
data varchar(18) 数据使用的空间总量。
index_size varchar(18) 索引使用的空间总量。
unused varchar(18) 为数据库中的对象保留但尚未使用的空间总量。

如果省略@objname并且@oneresultset1的值,则返回以下单个结果集以提供当前数据库大小信息。

列名称 数据类型 描述
database_name nvarchar(128) 当前数据库的名称。
database_size varchar(18) 当前数据库的大小 (MB)。 database_size 包括数据和日志文件。
unallocated space varchar(18) 数据库中未为数据库对象保留的空间。
reserved varchar(18) 由数据库中对象分配的空间总量。
data varchar(18) 数据使用的空间总量。
index_size varchar(18) 索引使用的空间总量。
unused varchar(18) 为数据库中的对象保留但尚未使用的空间总量。

如果 指定了@objname ,则会为指定的对象返回以下结果集。

列名称 数据类型 描述
name nvarchar(128) 请求其空间使用信息的对象的名称。

不会返回对象的架构名称。 如果需要架构名称,请使用 sys.dm_db_partition_statssys.dm_db_index_physical_stats 动态管理视图来获取等效的大小信息。
rows char(20) 表中现有的行数。 如果指定的对象是 Service Broker 队列,则此列指示队列中的消息数。
reserved varchar(18) @objname的预留空间总量。
data varchar(18) 数据在 @objname 中使用的总空间量。
index_size varchar(18) @objname索引使用的总空间量。
unused varchar(18) @objname 保留但尚未使用的总空间量。

如果未指定任何参数,则此模式为默认值。 返回以下结果集,详细说明磁盘上的数据库大小信息。

列名称 数据类型 描述
database_name nvarchar(128) 当前数据库的名称。
database_size varchar(18) 当前数据库的大小 (MB)。 database_size 包括数据和日志文件。 如果数据库具有MEMORY_OPTIMIZED_DATA文件组,则此值包括文件组中所有检查点文件的总磁盘大小。
unallocated space varchar(18) 数据库中未为数据库对象保留的空间。 如果数据库具有MEMORY_OPTIMIZED_DATA文件组,则此值包含文件组中状态PRECREATED为 检查point 文件的磁盘上总大小。

数据库中的表使用的空间。 此结果集不反映内存优化表,因为磁盘使用情况没有按表计算:

列名称 数据类型 描述
reserved varchar(18) 由数据库中对象分配的空间总量。
data varchar(18) 数据使用的空间总量。
index_size varchar(18) 索引使用的空间总量。
unused varchar(18) 为数据库中的对象保留但尚未使用的空间总量。

仅当数据库具有至少一个MEMORY_OPTIMIZED_DATA容器的文件组时,才会返回以下结果集:

列名称 数据类型 描述
xtp_precreated varchar(18) 状态为 PRECREATED检查point 文件的总大小(以 知识库(KB) 为单位)。 计入整个数据库中未分配的空间。 例如,如果预创建检查point 文件有 600,000 个知识库(KB),则此列包含600000 KB
xtp_used varchar(18) 状态为UNDER CONSTRUCTION检查点文件的总大小,ACTIVE以及MERGE TARGET知识库(KB)。 此值是用于内存优化表中数据的磁盘空间。
xtp_pending_truncation varchar(18) 状态为 WAITING_FOR_LOG_TRUNCATION检查point 文件的总大小(以 知识库(KB) 为单位)。 此值是用于等待清理的检查点文件的磁盘空间,一旦发生日志截断。

如果省略@objname,则@oneresultset1值为,@include_total_xtp_storage返回1以下单个结果集以提供当前数据库大小信息。 如果 @include_total_xtp_storage0 (默认值),则省略最后三列。

列名称 数据类型 描述
database_name nvarchar(128) 当前数据库的名称。
database_size varchar(18) 当前数据库的大小 (MB)。 database_size 包括数据和日志文件。 如果数据库具有MEMORY_OPTIMIZED_DATA文件组,则此值包括文件组中所有检查点文件的总磁盘大小。
unallocated space varchar(18) 数据库中未为数据库对象保留的空间。 如果数据库具有MEMORY_OPTIMIZED_DATA文件组,则此值包含文件组中状态PRECREATED为 检查point 文件的磁盘上总大小。
reserved varchar(18) 由数据库中对象分配的空间总量。
data varchar(18) 数据使用的空间总量。
index_size varchar(18) 索引使用的空间总量。
unused varchar(18) 为数据库中的对象保留但尚未使用的空间总量。
xtp_precreated1 varchar(18) 状态为 PRECREATED检查point 文件的总大小(以 知识库(KB) 为单位)。 此值计入整个数据库中未分配的空间。 如果数据库没有至少一个MEMORY_OPTIMIZED_DATA容器的文件组,则返回NULL
xtp_used1 varchar(18) 状态为UNDER CONSTRUCTION检查点文件的总大小,ACTIVE以及MERGE TARGET知识库(KB)。 此值是用于内存优化表中数据的磁盘空间。 如果数据库没有至少一个MEMORY_OPTIMIZED_DATA容器的文件组,则返回NULL
xtp_pending_truncation1 varchar(18) 状态为 WAITING_FOR_LOG_TRUNCATION检查point 文件的总大小(以 知识库(KB) 为单位)。 此值是用于等待清理的检查点文件的磁盘空间,一旦发生日志截断。 如果数据库没有至少一个MEMORY_OPTIMIZED_DATA容器的文件组,则返回NULL

1 仅当 @include_total_xtp_storage 设置为 1.

注解

该值database_size通常大于总和reservedunallocated space + ,因为它包括日志文件的大小,但reservedunallocated_space只考虑数据页。 在某些情况下,使用 Azure Synapse Analytics 时,此语句可能不正确。

XML 索引和全文索引 index_size 使用的页包含在这两个结果集中。 指定@objname,对象的 XML 索引和全文索引的页面也会在总计reservedindex_size结果中计数。

如果为数据库或空间索引的对象计算空间使用量,则空间大小列(例如 database_sizereservedindex_size)包括空间索引的大小。

指定@updateusage时,SQL Server 数据库引擎扫描数据库中的数据页,并针对每个表使用的存储空间对和sys.partitions目录视图进行任何必需的更正sys.allocation_units 例如,在删除索引后,在某些情况下,当表的空间信息可能不是当前时。 @updateusage可能需要一些时间才能在大型表或数据库上运行。 仅当怀疑返回了不正确的值,并且当进程对数据库中的其他用户或进程没有负面影响时,才使用 @updateusage 。 如果需要, DBCC UPDATEUSAGE 可以单独运行。

注意

在删除或重新生成大型索引时,或者在删除或截断大型表时,数据库引擎将延迟实际页释放及其关联锁,直至事务提交完毕为止。 延迟删除操作不会立即释放分配的空间。 因此,删除或截断大型对象后立即返回 sp_spaceused 的值可能不会反映可用的实际磁盘空间。

权限

向公共角色授予执行sp_spaceused权限。 只有 db_owner 固定数据库角色的成员可以指定 @updateusage 参数。

示例

A. 显示有关表的磁盘空间信息

以下示例报告 Vendor 表及其索引的磁盘空间信息。

USE AdventureWorks2022;
GO
EXEC sp_spaceused N'Purchasing.Vendor';
GO

B. 显示有关数据库的更新空间信息

以下示例汇总了当前数据库中使用的空间,并使用可选参数 @updateusage 以确保返回当前值。

USE AdventureWorks2022;
GO
EXEC sp_spaceused @updateusage = N'TRUE';
GO

°C 显示与已启用 Stretch 的表关联的远程表的空间使用情况信息

以下示例通过使用 @mode 参数来指定远程目标,汇总了与已启用 Stretch 的表关联的远程表使用的空间。 有关详细信息,请参阅 Stretch Database

USE StretchedAdventureWorks2022;
GO

EXEC sp_spaceused N'Purchasing.Vendor', @mode = 'REMOTE_ONLY';

D. 在单个结果集中显示数据库的空间使用情况信息

以下示例汇总了单个结果集中当前数据库的空间使用情况。

USE AdventureWorks2022;
GO
EXEC sp_spaceused @oneresultset = 1;

E. 在单个结果集中显示具有至少一个MEMORY_OPTIMIZED文件组的数据库的空间使用情况信息

以下示例汇总了当前数据库在单个结果集中至少有一 MEMORY_OPTIMIZED 个文件组的空间使用情况。

USE WideWorldImporters
GO

EXEC sp_spaceused @updateusage = 'FALSE',
    @mode = 'ALL',
    @oneresultset = '1',
    @include_total_xtp_storage = '1';
GO

F. 显示数据库中MEMORY_OPTIMIZED表对象的空间使用情况信息

以下示例汇总了当前数据库中至少有一个MEMORY_OPTIMIZEDMEMORY_OPTIMIZED文件组的表对象的空间使用情况。

USE WideWorldImporters
GO

EXEC sp_spaceused @objname = N'VehicleTemparatures',
    @updateusage = 'FALSE',
    @mode = 'ALL',
    @oneresultset = '0',
    @include_total_xtp_storage = '1';
GO