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で待機タイプ・時間・発生回数を確認可能。
- 代表的な待機タイプを把握すればボトルネック特定が容易。
- 長期監視・傾向分析で安定稼働を支援できる。
参考リンク

0 件のコメント:
コメントを投稿