sys.dm_os_latch_stats (Transact-SQL)

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

返回有关按类组织的所有闩锁等待的信息。

注意

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

列名称 数据类型 描述
latch_class nvarchar(60) 闩锁类的名称。
waiting_requests_count bigint 此类中的闩锁等待的个数。 此计数器在闩锁等待启动时递增。
wait_time_ms bigint 此类中闩锁的总计等待时间(毫秒)。

注意: 此列在闩锁等待和闩锁等待结束时每五分钟更新一次。
max_wait_time_ms bigint 内存对象已等待此闩锁的最大时间。 如果此值异常高,则可能指示有内部死锁。
pdw_node_id int 适用于:Azure Synapse Analytics、Analytics Platform System (PDW)

此分发所在节点的标识符。

权限

对于 SQL Server 和 SQL 托管实例,需要 VIEW SERVER STATE 权限。

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

SQL Server 2022 及更高版本的权限

要求对服务器具有 VIEW SERVER PERFORMANCE STATE 权限。

备注

通过检查不同闩锁类的相对等待数和等待时间,sys.dm_os_latch_stats 可以用来标识闩锁争用源。 在某些情况中,可能能够解决或减少闩锁争用。 但是,在某些情况下,可能需要联系 Microsoft 客户支持服务。

按如下所示使用 DBCC SQLPERF,可以重置 sys.dm_os_latch_stats 的内容:

DBCC SQLPERF ('sys.dm_os_latch_stats', CLEAR);  
GO  

这将使所有计数器重置为 0。

注意

如果重新启动 SQL Server,则不会保留这些统计信息。 自上次重置统计信息或 SQL Server 启动以来,所有数据都是累积的。

闩锁

闩锁是类似于锁的内部轻型同步对象,由各种 SQL Server 组件使用。 闩锁主要用于在缓冲区或文件访问等操作期间同步数据库页。 每个闩锁与单个分配单元关联。

由于闩锁由冲突模式中的另一个线程持有,所以当无法立即满足闩锁请求时,就会发生闩锁等待。 与锁不同,在操作之后,甚至在写入操作中,会立即释放闩锁。

闩锁根据组件和用法划分为不同的类。 特定类的零个或多个闩锁可以在 SQL Server 实例中的任何时间点存在。

注意

sys.dm_os_latch_stats 不跟踪立即授予的闩锁请求,也不会跟踪未等待失败的请求。

下表包含对各种闩锁类的简短说明。

闩锁类 说明
ALLOC_CREATE_RINGBUF SQL Server 在内部用于初始化创建分配环缓冲区的同步。
ALLOC_CREATE_FREESPACE_CACHE 用于初始化堆的内部可用空间缓存的同步。
ALLOC_CACHE_MANAGER 用于同步内部一致性测试。
ALLOC_FREESPACE_CACHE 用于同步对其空间可用于堆和二进制大型对象 (BLOB) 的页缓存的访问。 如果多个连接试图同时将行插入堆或 BLOB 中,则会发生对此类闩锁的争用。 通过将该对象分区,可以减少此争用。 每个分区都有它自己的闩锁。 分区将插入操作分散到多个闩锁。
ALLOC_EXTENT_CACHE 用于同步对包含未分配页的区数缓存的访问。 如果多个连接试图同时在相同的分配单元中分配数据页,则会发生对此类闩锁的争用。 通过将此分配单元属于其一部分的对象进行分区,可以减少此争用。
ACCESS_METHODS_DATASET_PARENT 用于同步在并行操作期间对父数据集进行的子数据集访问。
ACCESS_METHODS_HOBT_FACTORY 用于同步对内部哈希表的访问。
ACCESS_METHODS_HOBT 用于同步对 HoBt 的内存中表示的访问。
ACCESS_METHODS_HOBT_COUNT 用于同步对 HoBt 页和行计数器的访问。
ACCESS_METHODS_HOBT_VIRTUAL_ROOT 用于同步对内部 B 树的根页抽象的访问。
ACCESS_METHODS_CACHE_ONLY_HOBT_ALLOC 用于同步工作表访问。
ACCESS_METHODS_BULK_ALLOC 用于同步大容量分配器中的访问。
ACCESS_METHODS_SCAN_RANGE_GENERATOR 用于同步在并行扫描期间对范围生成器的访问。
ACCESS_METHODS_KEY_RANGE_GENERATOR 用于同步在关键范围并行扫描期间对预读操作的访问。
APPEND_ONLY_STORAGE_INSERT_POINT 用于同步在快速仅限追加存储单元中的插入。
APPEND_ONLY_STORAGE_FIRST_ALLOC 用于同步仅限追加存储单元的第一次分配。
APPEND_ONLY_STORAGE_UNIT_MANAGER 用于在快速仅限追加存储单元管理器中进行内部数据结构访问同步。
APPEND_ONLY_STORAGE_MANAGER 用于同步在快速仅限追加存储单元管理器中的收缩操作。
BACKUP_RESULT_SET 用于同步并行备份结果集。
BACKUP_TAPE_POOL 用于同步备份磁带池。
BACKUP_LOG_REDO 用于同步备份日志重做操作。
BACKUP_INSTANCE_ID 用于同步为备份性能监视计数器生成实例 ID 的过程。
BACKUP_MANAGER 用于同步内部备份管理器。
BACKUP_MANAGER_DIFFERENTIAL 用于同步用 DBCC 执行的差异备份操作。
BACKUP_OPERATION 用于备份操作(例如,数据库、日志或文件备份)中的内部数据结构同步。
BACKUP_FILE_HANDLE 用于同步在还原操作期间的文件打开操作。
BUFFER 用于同步对数据库页的短期访问。 读取或修改任何数据库页之前,必须使用缓冲区闩锁。 缓冲区闩锁争用可以指示出现了几个问题,包括热页和缓慢 I/O。

此闩锁类覆盖所有可能的页闩锁使用。 sys.dm_os_wait_stats在页面闩锁等待之间产生差异,这些等待由 I/O 操作和页面上的读取和写入操作引起。
BUFFER_POOL_GROW 用于在缓冲区池增长操作期间的内部缓冲区管理器同步。
DATABASE_CHECKPOINT 用于序列化数据库中的检查点。
CLR_PROCEDURE_HASHTABLE 仅供内部使用。
CLR_UDX_STORE 仅供内部使用。
CLR_DATAT_ACCESS 仅供内部使用。
CLR_XVAR_PROXY_LIST 仅供内部使用。
DBCC_CHECK_AGGREGATE 仅供内部使用。
DBCC_CHECK_RESULTSET 仅供内部使用。
DBCC_CHECK_TABLE 仅供内部使用。
DBCC_CHECK_TABLE_INIT 仅供内部使用。
DBCC_CHECK_TRACE_LIST 仅供内部使用。
DBCC_FILE_CHECK_OBJECT 仅供内部使用。
DBCC_PERF 用于同步内部性能监视器计数器。
DBCC_PFS_STATUS 仅供内部使用。
DBCC_OBJECT_METADATA 仅供内部使用。
DBCC_HASH_DLL 仅供内部使用。
EVENTING_CACHE 仅供内部使用。
FCB 用于同步对文件控制块的访问。
FCB_REPLICA 仅供内部使用。
FGCB_ALLOC 用于同步对文件组中循环法分配信息的访问。
FGCB_ADD_REMOVE 用于同步对文件组的访问,以便添加、删除、增长和收缩文件操作。
FILEGROUP_MANAGER 仅供内部使用。
FILE_MANAGER 仅供内部使用。
FILESTREAM_FCB 仅供内部使用。
FILESTREAM_FILE_MANAGER 仅供内部使用。
FILESTREAM_GHOST_FILES 仅供内部使用。
FILESTREAM_DFS_ROOT 仅供内部使用。
LOG_MANAGER 仅供内部使用。
FULLTEXT_DOCUMENT_ID 仅供内部使用。
FULLTEXT_DOCUMENT_ID_TRANSACTION 仅供内部使用。
FULLTEXT_DOCUMENT_ID_NOTIFY 仅供内部使用。
FULLTEXT_LOGS 仅供内部使用。
FULLTEXT_CRAWL_LOG 仅供内部使用。
FULLTEXT_ADMIN 仅供内部使用。
FULLTEXT_AMDIN_COMMAND_CACHE 仅供内部使用。
FULLTEXT_LANGUAGE_TABLE 仅供内部使用。
FULLTEXT_CRAWL_DM_LIST 仅供内部使用。
FULLTEXT_CRAWL_CATALOG 仅供内部使用。
FULLTEXT_FILE_MANAGER 仅供内部使用。
DATABASE_MIRRORING_REDO 仅供内部使用。
DATABASE_MIRRORING_SERVER 仅供内部使用。
DATABASE_MIRRORING_CONNECTION 仅供内部使用。
DATABASE_MIRRORING_STREAM 仅供内部使用。
QUERY_OPTIMIZER_VD_MANAGER 仅供内部使用。
QUERY_OPTIMIZER_ID_MANAGER 仅供内部使用。
QUERY_OPTIMIZER_VIEW_REP 仅供内部使用。
RECOVERY_BAD_PAGE_TABLE 仅供内部使用。
RECOVERY_MANAGER 仅供内部使用。
SECURITY_OPERATION_RULE_TABLE 仅供内部使用。
SECURITY_OBJPERM_CACHE 仅供内部使用。
SECURITY_CRYPTO 仅供内部使用。
SECURITY_KEY_RING 仅供内部使用。
SECURITY_KEY_LIST 仅供内部使用。
SERVICE_BROKER_CONNECTION_RECEIVE 仅供内部使用。
SERVICE_BROKER_TRANSMISSION 仅供内部使用。
SERVICE_BROKER_TRANSMISSION_UPDATE 仅供内部使用。
SERVICE_BROKER_TRANSMISSION_STATE 仅供内部使用。
SERVICE_BROKER_TRANSMISSION_ERRORS 仅供内部使用。
SSBXmitWork 仅供内部使用。
SERVICE_BROKER_MESSAGE_TRANSMISSION 仅供内部使用。
SERVICE_BROKER_MAP_MANAGER 仅供内部使用。
SERVICE_BROKER_HOST_NAME 仅供内部使用。
SERVICE_BROKER_READ_CACHE 仅供内部使用。
SERVICE_BROKER_WAITFOR_MANAGER 用于同步等待队列的实例级别映射。 每个数据库 ID、数据库版本和队列 ID 元组存在一个队列。 当许多连接处于 WAITFOR(RECEIVE) 等待状态时,此类闩锁上的争用可能会发生;调用 WAITFOR(RECEIVE):超过 WAITFOR 超时;接收消息;提交或回滚包含 WAITFOR(RECEIVE) 的事务;可以通过减少 WAITFOR(RECEIVE) 等待状态中的线程数来减少争用。
SERVICE_BROKER_WAITFOR_TRANSACTION_DATA 仅供内部使用。
SERVICE_BROKER_TRANSMISSION_TRANSACTION_DATA 仅供内部使用。
SERVICE_BROKER_TRANSPORT 仅供内部使用。
SERVICE_BROKER_MIRROR_ROUTE 仅供内部使用。
TRACE_ID 仅供内部使用。
TRACE_AUDIT_ID 仅供内部使用。
TRACE 仅供内部使用。
TRACE_CONTROLLER 仅供内部使用。
TRACE_EVENT_QUEUE 仅供内部使用。
TRANSACTION_DISTRIBUTED_MARK 仅供内部使用。
TRANSACTION_OUTCOME 仅供内部使用。
NESTING_TRANSACTION_READONLY 仅供内部使用。
NESTING_TRANSACTION_FULL 仅供内部使用。
MSQL_TRANSACTION_MANAGER 仅供内部使用。
DATABASE_AUTONAME_MANAGER 仅供内部使用。
UTILITY_DYNAMIC_VECTOR 仅供内部使用。
UTILITY_SPARSE_BITMAP 仅供内部使用。
UTILITY_DATABASE_DROP 仅供内部使用。
UTILITY_DYNAMIC_MANAGER_VIEW 仅供内部使用。
UTILITY_DEBUG_FILESTREAM 仅供内部使用。
UTILITY_LOCK_INFORMATION 仅供内部使用。
VERSIONING_TRANSACTION 仅供内部使用。
VERSIONING_TRANSACTION_LIST 仅供内部使用。
VERSIONING_TRANSACTION_CHAIN 仅供内部使用。
VERSIONING_STATE 仅供内部使用。
VERSIONING_STATE_CHANGE 仅供内部使用。
KTM_VIRTUAL_CLOCK 仅供内部使用。

注意

SQL Server 文档在提到索引时一般使用 B 树这个术语。 在行存储索引中,SQL Server 实现了 B+ 树。 这不适用于列存储索引或内存中数据存储。 有关详细信息,请参阅 SQL Server 以及 Azure SQL 索引体系结构和设计指南

另请参阅

DBCC SQLPERF (Transact-SQL)
与 SQL Server 操作系统相关的动态管理视图 (Transact-SQL)
SQL Server - Latches 对象