sys.dm_os_latch_stats (Transact-SQL)

適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

クラス別に編成されたすべてのラッチ待機に関する情報を返します。

Note

これを Azure Synapse Analytics または Analytics Platform System (PDW) から呼び出すには、 sys.dm_pdw_nodes_os_latch_statsという名前を使用します。 この構文は、Azure Synapse Analytics のサーバーレス SQL プールでサポートされていません。

列名 データ型 説明
latch_class nvarchar(60) ラッチ クラスの名前。
waiting_requests_count bigint このクラスのラッチの待機数。 このカウンターは、ラッチ待機の開始時に増分されます。
wait_time_ms bigint クラス内のラッチに対する合計待機時間 (ミリ秒単位)。

注: この列は、ラッチ待機中とラッチ待機の終了時に 5 分ごとに更新されます。
max_wait_time_ms bigint メモリ オブジェクトがラッチを待機した最大時間。 この値が著しく大きい場合、内部デッドロックを示している可能性があります。
pdw_node_id int 適用対象: Azure Synapse Analytics、Analytics Platform System (PDW)

このディストリビューションがオンになっているノードの識別子。

アクセス許可

SQL Server と SQL Managed Instance では、VIEW SERVER STATE アクセス許可が必要です。

SQL Database の BasicS0S1 サービス対象、および Elastic Pool のデータベースの場合、サーバー管理者アカウント、Microsoft Entra 管理者アカウント、または ##MS_ServerStateReader##サーバー ロールのメンバーシップが必要です。 他のすべての SQL Database サービス目標では、データベースに対する 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 にリセットされます。

Note

SQL Server が再起動された場合、これらの統計は保持されません。 統計が最後にリセットされてから、または SQL Server が開始されてから、すべてのデータが累積されます。

ラッチ

ラッチは、さまざまな SQL Server コンポーネントで使用されるロックに似た内部の軽量同期オブジェクトです。 ラッチは、主にバッファーやファイル アクセスなどの操作中にデータベース ページを同期するために使用されます。 各ラッチは、1 つのアロケーション ユニットに関連付けられています。

ラッチが別のスレッドによって、競合するモードで保持されており、ラッチ要求がすぐに許可されない場合は、ラッチ待機が発生します。 ロックとは異なり、書き込み操作でも、操作の直後にラッチが解放されます。

ラッチは、コンポーネントと使用法に基づいてクラスにグループ化されます。 特定のクラスの 0 個以上のラッチは、SQL Server のインスタンス内の任意の時点に存在できます。

Note

sys.dm_os_latch_stats は、すぐに許可されたラッチ要求、または待機せずに失敗したラッチ要求を追跡しません。

次の表に、さまざまなラッチ クラスの簡単な説明を示します。

Latch クラス 説明
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 復元操作中にファイルを開く操作を同期するために使用します。
バッファー データベース ページへの短期的なアクセスを同期するために使用されます。 データベース ページの読み取りまたは変更を行う前に、バッファー ラッチが必要です。 バッファー ラッチの競合は、ホット ページや低速 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 タプルごとに 1 つのキューが存在します。 このクラスのラッチの競合は、多くの接続がある場合に発生する可能性があります: 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 内部のみで使用します。

Note

ドキュメントでは、一般的にインデックスを参照して B ツリーという用語を使用します。 行ストア インデックスでは、データベース エンジンは B+ ツリーを実装します。 これは、メモリ最適化テーブルの列ストア インデックスまたはインデックスには適用されません。 詳細については、「SQL Server と Azure SQL のインデックスのアーキテクチャとデザイン ガイド」を参照してください。

参照

DBCC SQLPERF (Transact-SQL)
SQL Server オペレーティングシステム関連の動的管理ビュー (Transact-sql)
SQL Server の Latches オブジェクト