• システム開発に関わる内容をざっくりと書いていく

SQL Server ブロッキングの見方(誰が止めているか)

「クエリが返ってこない」「タイムアウトばかり」のとき、実体がブロッキング(誰かがロックを持ったまま、別セッションが待たされている)であることが多い。デッドロックと違い、自動解消されず待ち続ける。

先に結論

  • 見るべきはヘッドブロッカー(鎖の先頭でロックを保持しているセッション)
  • 待っている側を殺しても、原因セッションが残れば再発する
  • 活動モニタや動的管理ビューで「誰が・何を・どれくらい」を取る
  • 根本はトランザクション長・索引・取得範囲の見直し

ざっくり見る手順

  1. SSMS の活動モニタで「ブロックされている」プロセスを開く
  2. 待ち種別がロック系か(PAGE/KEY/RID など)を確認
  3. ブロックしているセッション ID をたどり、先頭まで遡る
  4. 先頭セッションの実行中テキスト・開始時刻・オープン中トランザクション有無を控える
  5. アプリ側ならリクエスト ID・ユーザー操作と紐付ける

現場でありがちなパターン

  • 画面操作の途中で長いトランザクション(ユーザー入力待ちを含む)
  • 一括更新が広い範囲のロックを長時間保持
  • 索引不足でスキャンしながら更新し、ロック範囲が広がる
  • 未コミットのままコネクションがアプリに返却されている

関連: デッドロック概要と対策(相互待ちとの違い整理)

対処の優先順位

  • 緊急時のみ先頭セッションの中断を検討(業務影響を確認)
  • 恒久策はトランザクション短縮・必要行のみ更新・適切な索引
  • 読み取り側の分離レベル変更は副作用があるので最後の手段寄り
  • 再現時間帯のバッチスケジュールをずらすだけでも効くことがある

ざっくりまとめ

  • 待つ側より止める側(ヘッド)を見る
  • 活動モニタ/DMV で鎖をたどる
  • 殺すのは応急。長さと範囲の設計が本丸

関連記事