今回は、SQL Serverのロックエスカレーションが発生しているかどうかを確認する方法を備忘として残したいと思います。
主に、以下の方の記事を参考にさせていただきました。
SQL Server / SQL Database パフォーマンスチューニング & トラブルシューティング シリーズ : SQL Server のロックの基本的な動作 at SE の雑記
ロックエスカレーションの発生確認方法
いくつか確認方法はあるようですが、DMVで確認できる方法が一番簡単なのでこちらを紹介します。
SELECT database_id, OBJECT_NAME(object_id), index_id, index_lock_promotion_attempt_count, index_lock_promotion_count FROM sys.dm_db_index_operational_stats( DB_ID(N'データベース名'), OBJECT_ID(N'テーブル名'), NULL, NULL )
上記のなかで重要なのは、もちろん以下の2つのカラムです。
「index_lock_promotion_attempt_count」がロックエスカレーションの成否にかかわらず試行した回数で、「index_lock_promotion_count」が実際にロックエスカレーションを試行した回数と読み取れます。
因みにこの回数は、SQL Serverのサービスを最後に起動してからの累積値となるようで、再起動したらレコードごと消えていました。だいたいどのくらい発生しているのかを把握したいときには、これで十分かなと思います。
ただ、実際にいつロックエスカレーションが発生したかどうかなどがわからないので、その場合は別の方法で確認する必要がありそうです。
(冒頭の参考にさせていただいた記事には、拡張イベントで取得できる旨記載がありました)