SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server の内部の待ち事象を確認する 3 種類のテーブル

leave a comment

SQL Server には内部の待ち事象を確認するための 3 種類のテーブルが存在しています。
今回の投稿ではこのテーブルについて少しまとめておきたいと思います。

SQL Server では、内部の待ち事象を確認するために以下の 3 種類の DMV が提供されています。

sys.dm_os_wait_stats と sys.dm_os_latch_stats に関しては、以前書いた SQL Server の待ち事象を見るいくつかの方法 という投稿で触れています。

sys.dm_os_wait_stats では

  • 実行状態
  • 実行可能状態
  • 待ち状態

と遷移するタスクの実行状態で、待ち状態に入っていたタスクの統計を確認することができます。

sys.dm_os_latch_stats に関しては、sys.dm_os_wait_stats の中で、LATCH_xx の詳細について確認することができます。

ラッチについては、ロックと合わせて説明がされることが多いかと思います。
ロックはレコードの整合性を保つための機構となり、データが一貫性が取れていることを保証するために取得を行っています。
ラッチは、ページ情報の整合性を保つための機構となり、ディスクとメモリ間のページの I/O やページヘッダの更新等が行われる際の一貫性を保つために取得が行われます。
# ロック同様にラッチにも互換性があります。

sys.dm_os_wait_stats でもラッチの情報はわかり、

  • LATCH_xx
  • PAGELATCH_xx
  • PAGEIOLATCH_xx

を確認することができるのですが、LATCH_xx の詳細を確認するためには、sys.dm_os_latch_stats から確認をする必要があります。

最後の sys.dm_os_spinlock_stats はスピンロックによる待ちの情報を取得するためのものになります。
現状、この DMV の情報は Books Online には記載されておらず、Undocument のようです。

いくつかの KB ではこの DMV について触れられています。
FIX SQL Server 2012年でデータベースのロックの利用状況の増加時にパフォーマンス上の問題が発生します。
FIX: Performance decreases after an ALTER INDEX…ONLINE operation is aborted in SQL Server 2012
FIX パフォーマンス上の問題が発生する NUMA 環境で外部のページを SQL Server 2012年での処理中に

SQL Server では、ロックのような排他制御ではなくスピンロックによる待ちにより処理が行われているケースがあります。
私は動作をきちんと理解できているわけではないのですが、情報としては SQLCAT.com consolidated index of Whitepapers で公開されている、Diagnosing and Resolving Spinlock Contention on SQL Server が参考になるかと思います。
SOS やログ系のものもいくつかあり、CPU の使用状況やログキャッシュ系の状態と絡められるといいのかなと思っています。

待ち事象の情報は SQL Server のサービスが最後に起動してからの累積値となりますので特定の時間帯の待ち事象の方法を取得したい場合には、2 点間の情報の差分をとるか、一度以下のクエリを実行して待ち事象の集計値をリセットを検討したほうがよいかと。

DBCC SQLPERF('sys.dm_os_wait_stats', CLEAR)
DBCC SQLPERF('sys.dm_os_latch_stats', CLEAR)
DBCC SQLPERF('sys.dm_os_spinlock_stats', CLEAR)
Share

Written by Masayuki.Ozawa

3月 20th, 2014 at 8:14 am

Posted in SQL Server

Tagged with

Leave a Reply