sys.dm_db_file_space_usage (Transact-SQL)

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

返回数据库中每个数据文件的空间使用情况信息。

注意

若要从 Azure Synapse Analytics 或 Analytics 平台系统(PDW)调用此名称,请使用名称 sys.dm_pdw_nodes_db_file_space_usage。 Azure Synapse Analytics 中的无服务器 SQL 池不支持此语法。

列名称 数据类型 描述
database_id smallint 数据库 ID。

在 Azure SQL 数据库中,这些值在单一数据库或弹性池中是唯一的,但在逻辑服务器中不是唯一的。
file_id smallint 文件 ID。

file_idfile_id 映射到 sys.dm_io_virtual_file_stats 和 sys.sysfiles 中的 fileid。
filegroup_id smallint 适用于:SQL Server 2012 (11.x) 及更高版本。

文件组 ID。
total_page_count bigint 适用于:SQL Server 2012 (11.x) 及更高版本。

数据文件中的页总数。
allocated_extent_page_count bigint 适用于:SQL Server 2012 (11.x) 及更高版本。

数据文件中已分配区中的页总数。
unallocated_extent_page_count bigint 数据文件中未分配的盘区中的页总数。

未在分配的盘区中包括未使用的页。
version_store_reserved_page_count bigint 为版本存储分配的统一区中的总页数。 永远不会从混合区分配版本存储页。

不包括 IAM 页,因为它们始终是从混合盘区分配的。 如果 PFS 页是从统一区分配的,则包括 PFS 页。

有关详细信息,请参阅 sys.dm_tran_version_store (Transact-SQL)
user_object_reserved_page_count bigint 从统一区为数据库中的用户对象分配的总页数。 计数中包括已分配区中未使用的页。

不包括 IAM 页,因为它们始终是从混合盘区分配的。 如果 PFS 页是从统一区分配的,则包括 PFS 页。

可以使用total_pagessys.allocation_units目录视图中的列返回用户对象中每个分配单元的保留页计数。 但是,该 total_pages 列包含 IAM 页。
internal_object_reserved_page_count bigint 从统一区为文件中的内部对象分配的总页数。 计数中包括已分配区中未使用的页。

不包括 IAM 页,因为它们始终是从混合盘区分配的。 如果 PFS 页是从统一区分配的,则包括 PFS 页。

不存在可返回每个内部对象的页计数的目录视图或动态管理对象。
mixed_extent_page_count bigint 文件的已分配混合区中的已分配和未分配总页数。 混合区包含分配给不同对象的页。 此计数包含文件中的所有 IAM 页。
modified_extent_page_count bigint 适用于:SQL Server 2016 (13.x) SP2 及更高版本。

自上次完整数据库备份以来,在文件的已分配区中修改的总页数。 修改后的页计数可用于跟踪自上次完整备份以来数据库中的差异更改数,以确定是否需要差异备份。
pdw_node_id int 适用于:Azure Synapse Analytics、Analytics Platform System (PDW)

此分发所在节点的标识符。
distribution_id int 适用于:Azure Synapse Analytics、Analytics Platform System (PDW)

与分布关联的唯一数值 ID。

注解

页计数始终为区级计数。 因此,页计数值始终为 8 的倍数。 包含全局分配映射表 (GAM) 和共享全局分配映射表 (SGAM) 分配页的区是已分配的统一区。 它们不包括在前面描述的页面计数中。 有关页和盘区的详细信息,请参阅 页和盘区体系结构指南

当前版本存储的内容位于 sys.dm_tran_version_store中。 在文件级而不是会话级和任务级跟踪版本存储页,因为它们是全局资源。 会话可能会生成版本,但会话结束时无法删除版本。 版本存储清除必须考虑需要访问特定版本的运行时间最长的事务。 可以通过查看sys.dm_tran_active_snapshot_database_transactions中的elapsed_time_seconds列来发现与版本存储清理相关的最长运行事务。

列中的频繁更改 mixed_extent_page_count 可能表示大量使用 SGAM 页面。 如出现此情况,您会看到多个 PAGELATCH_UP 等待,且正在等待 SGAM 页资源。 有关详细信息,请参阅sys.dm_os_waiting_tasks(Transact-SQL)sys.dm_os_wait_stats(Transact-SQL)sys.dm_os_latch_stats(Transact-SQL)。

用户对象

用户对象页计数器中包括下列对象:

  • 用户定义的表和索引
  • 系统表和索引
  • 全局临时表和索引
  • 局部临时表和索引
  • 表变量
  • 表值函数中返回的表

内部对象

内部对象仅位于 tempdb. 内部对象页计数器中包括下列对象:

  • 用于游标或假脱机操作以及临时大型对象 (LOB) 存储的工作表
  • 用于哈希联接等操作的工作文件
  • 排序段

关系基数

操作 关系
sys.dm_db_file_space_usage.database_id, file_id sys.dm_io_virtual_file_stats.database_id, file_id 一对一

权限

在 SQL Server 2019(15.x)和早期版本以及SQL 托管实例上,需要VIEW SERVER STATE权限。

在 SQL Server 2022(16.x)及更高版本上,需要对服务器具有 VIEW SERVER PERFORMANCE STATE 权限。

在 SQL 数据库“基本”、“S0”和“S1”服务目标中,对于“弹性池”中的数据库,服务器管理员帐户、Microsoft Entra 管理员帐户或 ##MS_ServerStateReader## 服务器角色中的成员身份为必填项。 对于所有其他 SQL 数据库服务目标,需要数据库的 VIEW DATABASE STATE 权限或 ##MS_ServerStateReader## 服务器角色中的成员身份。

示例

确定可用空间量 tempdb

以下查询返回所有数据文件 tempdb中可用的可用页总数和总可用空间(MB)。

USE tempdb;
GO

SELECT
    SUM(unallocated_extent_page_count) AS [free pages],
    (SUM(unallocated_extent_page_count) * 1.0 / 128) AS [free space in MB]
FROM sys.dm_db_file_space_usage;

确定用户对象使用的空间量

以下查询返回用户对象使用的页总数和用户对象所使用的 tempdb总空间。

USE tempdb;
GO

SELECT
    SUM(user_object_reserved_page_count) AS [user object pages used],
    (SUM(user_object_reserved_page_count) * 1.0 / 128) AS [user object space in MB]
FROM sys.dm_db_file_space_usage;

另请参阅