适用于:SQL Server 
Azure SQL 数据库 
Azure SQL 托管实例 
Azure Synapse Analytics 
Analytics Platform System (PDW)
返回有关当前位于 SQL Server 缓冲池中的所有数据页的信息。 可以使用该视图的输出,根据数据库、对象或类型来确定缓冲池内数据库页的分布。 在 SQL Server 中,此动态管理视图还会返回有关缓冲池扩展文件中数据页的信息。 有关详细信息,请参阅 缓冲池扩展。
从磁盘读取数据页时,该页将复制到 SQL Server 缓冲池中并缓存以供重复使用。 每个缓存的数据页都有一个缓冲描述符。 缓冲区描述符唯一标识当前缓存在 SQL Server 实例中的每个数据页。 sys.dm_os_buffer_descriptors 返回所有用户数据库和系统数据库的缓存页。 这包括与 Resource 数据库相关联的页。
注意
若要从 Azure Synapse Analytics 或 Analytics 平台系统(PDW)调用此名称,请使用名称 sys.dm_pdw_nodes_os_buffer_descriptors。 Azure Synapse Analytics 中的无服务器 SQL 池不支持此语法。
| 列名称 | 数据类型 | 描述 | 
|---|---|---|
| database_id | int | 与缓冲池中的页关联的数据库 ID。 可以为 Null。 在 Azure SQL 数据库中,这些值在单一数据库或弹性池中是唯一的,但在逻辑服务器中不是唯一的。 | 
| file_id | int | 存储页的持久化图像的文件 ID。 可以为 Null。 | 
| page_id | int | 文件中页面的 ID。 可以为 Null。 | 
| page_level | int | 页的索引级别。 可以为 Null。 | 
| allocation_unit_id | bigint | 页的分配单元的 ID。 可使用此值联接 sys.allocation_units。 可以为 Null。 | 
| page_type | nvarchar(60) | 页类型,例如数据页或索引页。 可以为 Null。 | 
| row_count | int | 页中的行数。 可以为 Null。 | 
| free_space_in_bytes | int | 页中的可用空间(字节)。 可以为 Null。 | 
| is_modified | bit | 1 = 从磁盘读取页后已对其进行修改。 可以为 Null。 | 
| numa_node | int | 缓冲区的非一致性内存访问节点。 可以为 Null。 | 
| read_microsec | bigint | 将此页读入缓冲区所需的实际时间(微秒)。 重用缓冲区时重置该数值。 可以为 Null。 | 
| is_in_bpool_extension | bit | 1 = 页面位于缓冲池扩展中。 可以为 Null。 | 
| pdw_node_id | int | 适用于:Azure Synapse Analytics、Analytics Platform System (PDW) 此分发所在节点的标识符。 | 
权限
对于 SQL Server 和 SQL 托管实例,需要 VIEW SERVER STATE 权限。
在 SQL 数据库“基本”、“S0”和“S1”服务目标中,对于“弹性池”中的数据库,服务器管理员帐户、Microsoft Entra 管理员帐户或 ##MS_ServerStateReader## 服务器角色中的成员身份为必填项。 对于所有其他 SQL 数据库服务目标,需要数据库的 VIEW DATABASE STATE 权限或 ##MS_ServerStateReader## 服务器角色中的成员身份。
SQL Server 2022 及更高版本的权限
要求对服务器具有 VIEW SERVER PERFORMANCE STATE 权限。
注解
sys.dm_os_buffer_descriptors返回资源数据库正在使用的页面。 sys.dm_os_buffer_descriptors不会返回有关免费或被盗页面的信息,也不会返回有关阅读时出错的页面的信息。
| From | 操作 | 开 | 关系 | 
|---|---|---|---|
| sys.dm_os_buffer_descriptors | sys.databases | database_id | 多对一 | 
| sys.dm_os_buffer_descriptors | <userdb>.sys.allocation_units | allocation_unit_id | 多对一 | 
| sys.dm_os_buffer_descriptors | <userdb>.sys.database_files | file_id | 多对一 | 
| sys.dm_os_buffer_descriptors | sys.dm_os_buffer_pool_extension_configuration | file_id | 多对一 | 
示例
A. 返回每个数据库的缓存页计数
以下示例返回为每个数据库加载的页的计数。
SELECT COUNT(*)AS cached_pages_count  
    ,CASE database_id   
        WHEN 32767 THEN 'ResourceDb'   
        ELSE db_name(database_id)   
        END AS database_name  
FROM sys.dm_os_buffer_descriptors  
GROUP BY DB_NAME(database_id) ,database_id  
ORDER BY cached_pages_count DESC;  
B. 返回当前数据库中每个对象的缓存页计数
以下示例返回为当前数据库中每个对象加载的页的计数。
SELECT COUNT(*)AS cached_pages_count   
    ,name ,index_id   
FROM sys.dm_os_buffer_descriptors AS bd   
    INNER JOIN   
    (  
        SELECT object_name(object_id) AS name   
            ,index_id ,allocation_unit_id  
        FROM sys.allocation_units AS au  
            INNER JOIN sys.partitions AS p   
                ON au.container_id = p.hobt_id   
                    AND (au.type = 1 OR au.type = 3)  
        UNION ALL  
        SELECT object_name(object_id) AS name     
            ,index_id, allocation_unit_id  
        FROM sys.allocation_units AS au  
            INNER JOIN sys.partitions AS p   
                ON au.container_id = p.partition_id   
                    AND au.type = 2  
    ) AS obj   
        ON bd.allocation_unit_id = obj.allocation_unit_id  
WHERE database_id = DB_ID()  
GROUP BY name, index_id   
ORDER BY cached_pages_count DESC;  
另请参阅
sys.allocation_units (Transact-SQL)
与 SQL Server 操作系统相关的动态管理视图 (Transact-SQL)
Resource 数据库
sys.dm_os_buffer_pool_extension_configuration (Transact-SQL)