sp_spaceused (Transact-SQL)
适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
Analytics Platform System (PDW)
sp_spaceused
系统存储过程显示以下任一项:
当前数据库中表、索引视图或 Service Broker 队列使用的行数、保留磁盘空间和磁盘空间数
整个数据库保留和使用磁盘空间
语法
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上运行。 值可以是 true
或 false
。
[ @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 |
当@objname或NULL 未指定时,将返回单个结果集。 |
[ @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_stats 或 sys.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 为检查点文件的磁盘上总大小。 |
数据库中的表使用的空间。 此结果集不反映内存优化表,因为磁盘使用情况没有按表计算:
列名称 | 数据类型 | 描述 |
---|---|---|
reserved |
varchar(18) | 由数据库中对象分配的空间总量。 |
data |
varchar(18) | 数据使用的空间总量。 |
index_size |
varchar(18) | 索引使用的空间总量。 |
unused |
varchar(18) | 为数据库中的对象保留但尚未使用的空间总量。 |
仅当数据库具有至少一个MEMORY_OPTIMIZED_DATA
容器的文件组时,才会返回以下结果集:
列名称 | 数据类型 | 描述 |
---|---|---|
xtp_precreated |
varchar(18) | 状态 PRECREATED 为 KB 的检查点文件的总大小。 计入整个数据库中未分配的空间。 例如,如果有 600,000 KB 的预创建检查点文件,则此列包含 600000 KB 。 |
xtp_used |
varchar(18) | 状态 UNDER CONSTRUCTION 为检查点文件的总大小, ACTIVE 以 MERGE TARGET KB 为单位。 此值是用于内存优化表中数据的磁盘空间。 |
xtp_pending_truncation |
varchar(18) | 状态 WAITING_FOR_LOG_TRUNCATION 为 KB 的检查点文件的总大小。 此值是用于等待清理的检查点文件的磁盘空间,一旦发生日志截断。 |
如果省略@objname,则@oneresultset1
的值为,@include_total_xtp_storage返回1
以下单个结果集以提供当前数据库大小信息。 如果 @include_total_xtp_storage 为 0
(默认值),则省略最后三列。
列名称 | 数据类型 | 描述 |
---|---|---|
database_name |
nvarchar(128) | 当前数据库的名称。 |
database_size |
varchar(18) | 当前数据库的大小 (MB)。 database_size 包括数据和日志文件。 如果数据库具有 MEMORY_OPTIMIZED_DATA 文件组,则此值包括文件组中所有检查点文件的磁盘上总大小。 |
unallocated space |
varchar(18) | 数据库中未为数据库对象保留的空间。 如果数据库具有 MEMORY_OPTIMIZED_DATA 文件组,则此值包括文件组中状态 PRECREATED 为检查点文件的磁盘上总大小。 |
reserved |
varchar(18) | 由数据库中对象分配的空间总量。 |
data |
varchar(18) | 数据使用的空间总量。 |
index_size |
varchar(18) | 索引使用的空间总量。 |
unused |
varchar(18) | 为数据库中的对象保留但尚未使用的空间总量。 |
xtp_precreated 1 |
varchar(18) | 状态 PRECREATED 为 KB 的检查点文件的总大小。 此值计入整个数据库中未分配的空间。 如果数据库没有至少一个MEMORY_OPTIMIZED_DATA 容器的文件组,则返回NULL 。 |
xtp_used 1 |
varchar(18) | 状态 UNDER CONSTRUCTION 为检查点文件的总大小, ACTIVE 以 MERGE TARGET KB 为单位。 此值是用于内存优化表中数据的磁盘空间。 如果数据库没有至少一个MEMORY_OPTIMIZED_DATA 容器的文件组,则返回NULL 。 |
xtp_pending_truncation 1 |
varchar(18) | 状态 WAITING_FOR_LOG_TRUNCATION 为 KB 的检查点文件的总大小。 此值是用于等待清理的检查点文件的磁盘空间,一旦发生日志截断。 如果数据库没有至少一个MEMORY_OPTIMIZED_DATA 容器的文件组,则返回NULL 。 |
1 仅当 @include_total_xtp_storage 设置为 1
.
注解
该值database_size
通常大于总和reserved
unallocated space
+ ,因为它包括日志文件的大小,但reserved
unallocated_space
只考虑数据页。 在某些情况下,使用 Azure Synapse Analytics 时,此语句可能不正确。
XML 索引和全文索引 index_size
使用的页包含在这两个结果集中。 指定@objname时,对象的 XML 索引和全文索引的页面也会在总计reserved
和index_size
结果中计数。
如果为数据库或空间索引的对象计算空间使用量,则空间大小列(例如 database_size
, reserved
和 index_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_OPTIMIZED
MEMORY_OPTIMIZED
文件组的表对象的空间使用情况。
USE WideWorldImporters
GO
EXEC sp_spaceused @objname = N'VehicleTemparatures',
@updateusage = 'FALSE',
@mode = 'ALL',
@oneresultset = '0',
@include_total_xtp_storage = '1';
GO