2026年3月27日金曜日

SQL Server 待機統計(Wait Stats)の見方と活用法|ボトルネック特定とチューニングの基本

SQL Serverの性能問題を数値で見抜く!待機統計(Wait Stats)の見方とチューニング活用法

SQL Serverで「処理が遅い」「CPUは空いているのに応答が重い」といった状況に遭遇することはありませんか? その原因を探るための強力な分析手法が待機統計(Wait Statistics)です。
Wait Statsは、SQL Serverの内部で「どのリソースをどれだけ待っているか」を示す情報であり、 ボトルネックの特定やパフォーマンスチューニングに不可欠な指標です。
この記事では、Wait Statsの基本概念から、主要な待機タイプ、実務での分析・対処法までをわかりやすく解説します。

目次

待機統計(Wait Stats)とは?

SQL Serverのリソース待機を数値化した情報

待機統計(Wait Statistics)は、SQL Serverの内部プロセスがリソース(CPU、メモリ、IOなど)を待機した時間を集計した統計情報です。 各待機タイプには特定の原因やリソースが紐づいており、どこにボトルネックがあるかを定量的に把握できます。

なぜ重要なのか

  • どのリソースが遅延の主因かを特定できる
  • SQLレベルのボトルネックを俯瞰的に分析できる
  • 実行計画やインデックス調整の前に「待機原因」を知ることで効率的にチューニング可能

待機が発生する仕組み

タスクとスレッドの待機動作

SQL Serverでは複数のタスク(要求)が同時に処理されています。 あるタスクが必要なリソースを利用できない場合、そのスレッドは「待機状態」になります。


例:
・別のトランザクションがロックを保持している → ロック待機(LCK_)
・ディスクI/O処理が完了していない → PAGEIOLATCH_XX
・CPUキューが混雑 → SOS_SCHEDULER_YIELD

これらの待機情報が累積され、sys.dm_os_wait_statsに記録されます。

sys.dm_os_wait_statsで待機情報を取得する方法

基本的な取得クエリ


SELECT TOP 20
    wait_type,
    wait_time_ms / 1000.0 AS WaitTimeSec,
    waiting_tasks_count AS WaitCount,
    (wait_time_ms / waiting_tasks_count) AS AvgWaitMs
FROM sys.dm_os_wait_stats
WHERE wait_type NOT LIKE 'SLEEP%'
  AND wait_type NOT IN ('BROKER_TASK_STOP','SQLTRACE_BUFFER_FLUSH','XE_TIMER_EVENT','XE_DISPATCHER_WAIT')
ORDER BY wait_time_ms DESC;

この結果から「どの待機タイプが多いか」を確認します。 重要なのは「発生回数」よりも「累積待機時間」です。

リセット方法


DBCC SQLPERF('sys.dm_os_wait_stats', CLEAR);

累積統計をクリアして、再計測を行うと短期的な傾向を分析できます(本番環境では注意して実施)。

代表的な待機タイプと原因の見方

よく見る主要な待機タイプ

待機タイプ 主な原因 対処・確認ポイント
LCK_M_* ロック競合(更新・削除の同時実行) トランザクション分離レベル、索引設計を見直す
PAGEIOLATCH_* ディスクI/O待機 ストレージ性能、バッファキャッシュ効率を確認
ASYNC_NETWORK_IO アプリケーション側が結果を読み取るのが遅い アプリ側の処理・ネットワーク遅延を確認
WRITELOG トランザクションログ書き込み待機 ログドライブ性能、バッチ設計を見直す
SOS_SCHEDULER_YIELD CPUリソースの待機(CPU過負荷) CPU利用率や並列度設定を確認

分析のコツ

  • 同じ待機タイプが継続的に上位に出る場合 → 恒常的なボトルネック
  • 特定時間帯に偏る場合 → バッチ・トランザクションの同時実行影響
  • 待機タイプを1つずつ調べるより、「傾向」を見るのが重要

ボトルネック分析と対策の実務手順

① 全体傾向を把握

まず上位10件の待機タイプを確認し、どのリソースに偏りがあるかを把握します。 CPU/IO/ロック/ネットワークなど、大まかなカテゴリで分類します。

② 個別要因を深掘り

  • ロック系 → sys.dm_tran_locks、sys.dm_exec_requestsを併用
  • I/O系 → sys.dm_io_virtual_file_statsでディスク単位の待機確認
  • CPU系 → sys.dm_exec_query_statsで高負荷クエリを抽出

③ 改善施策を実施

  • インデックス最適化・統計更新
  • トランザクション粒度の見直し
  • ハードウェア・I/O構成改善

Wait Statsは「何を待っているか」を示す指標であり、SQLチューニングの出発点として活用できます。

定期監視とリセットのポイント

定期監視のすすめ

  • 1日1回程度、sys.dm_os_wait_statsをスナップショット取得
  • 傾向をグラフ化して、平常値と異常値を比較
  • SQL Agentジョブで自動収集するのが実務的

リセットのタイミング

統計はSQL Server起動から累積されるため、長期運用では過去データに埋もれてしまいます。 障害分析時や期間分析を行いたい場合は、DBCC SQLPERFでリセットして短期的な測定を行うと効果的です。

まとめと次のステップ

学んだ内容の整理

  • Wait StatsはSQL Server内部のリソース待機状況を数値化した情報。
  • sys.dm_os_wait_statsで待機タイプ・時間・発生回数を確認可能。
  • 代表的な待機タイプを把握すればボトルネック特定が容易。
  • 長期監視・傾向分析で安定稼働を支援できる。
SQL Server学習シリーズ
◀ 【第3回】クエリパフォーマンスチューニング総まとめ
【第5回】インデックス再構築と再編成の違い ▶
目次へ

参考リンク

SQL Server 解説用イメージ

0 件のコメント:

コメントを投稿