現時点のリリースノートには記載されていないのですが、SQL Server 2022 では、ラッチ (ページラッチ / バッファーラッチ) で待機が発生している場合の情報の出力内容が強化されています。
SQL Server では、ラッチは、
- バッファーラッチ
- 非バッファラッチ (Non Buffer Latch)
の二種類に大別されますが、今回は「バッファーラッチ」を例として情報を記載しています。
SQL Server のラッチについては、SQL Server でラッチの競合を診断および解決する で解説されていますので、ラッチについての詳細はこちらを確認してください。
ラッチについては SQL Server 以外の RDBMS でも実装されています。
- https://dev.mysql.com/doc/refman/5.6/ja/glossary.html#glos_latch
- https://www.postgresql.jp/document/pg653doc/ej/user/x3974.htm
- https://support.oracle.com/knowledge/Oracle%20Database%20Products/2015571_1.html
SQL Server ではラッチというと非バッファラッチを差すケースが多いですが、RDBMS における一般的なラッチは、SQL Server ではバッファーラッチとなり、メモリ上のページの保護をするために使用されている同期プリミティブを刺すことになると思います。
SQL Server バッファー プール内のページのデータの書き込みまたは読み取りが行われるときは常に、ワーカー スレッドにおいて最初にそのページのバッファー ラッチを取得する必要があります。 バッファー プール内のページにアクセスするために使用できるバッファー ラッチには、排他的ラッチ (PAGELATCH_EX) や共有ラッチ (PAGELATCH_SH) など、さまざまな種類があります。
SQL Server 2019 までは、待機事象が発生しているリソースを表す「resource_description」については、ページラッチが発生した場合は、次のような情報となっていました。
Negative Blocking Session Ids (-5 = Latch ANY TASK RELEASOR) で紹介されているラッチ待機の情報の出力内容の強化は SQL Database ではすでに実装されていたものとなるのですが、この機能が SQL Server 2022 でも追加されており、ラッチ待機が発生した際の情報が次のように表示されるようになります。(画像の情報は「select * from sys.dm_os_waiting_tasks where wait_type like ‘PAGELATCH%’」で取得したものとなります)
SQL Server 2022 からは、バッファーラッチが発生している場合、ページ番号だけでなく、
- ラッチのアドレス
- タスクのアドレス
というように、どのタスクがどのアドレスへのアクセスへのアクセスで待機されているかについても表示されるようになります。
これに伴い、バッファーの情報を参照することができる sys.dm_os_buffer_descriptors についても項目が追加されています。
従来まではバッファープールに読み込まれているページの情報について取得することができたのですが、SQL Server 2022 では、次の項目が追加されています。(現時点ではドキュメントには追記されていません)
- buffer_address
- 0x000002452F3CC6C0
- latch_address
- 0x000002452F3CC758
- latch_desc
- (LATCH 0x000002452F3CC758: Class: BUFFER KP: 0 SH: 1 UP: 0 EX: 0 DT: 0 Sublatch: 0 HasWaiters: 0 Task: 0x0000000000000000 AnyReleasor: 0)
各項目の値のサンプルも記載していますが、バッファープールに読み込まれているページについて、
- アクセスするために取得する必要のあるラッチのアドレス
- ページにアクセスするためのバッファーのアドレス
- 取得されているラッチの説明
というような情報を確認することができるようになりました。
これらの情報を組み合わせると「buffer_address」と「DBCC PAGE」の結果の対比や、
ラッチが取得されている場合の、ラッチのアドレスの内容の比較
といった、内部動作の確認を従来より柔軟に実施することができるようになります。
追加された情報の活用方法としてはトラブルシューティングの際の付加情報となると思いますが、SQL Server の動作を把握するうえで、このような情報は活用できるのではないでしょうか。