特定のテーブルで Insert や Updateがタイムアウトする

SQL Serverで特定のテーブルだけでInsertやUpdateがタイムアウトになり、レコードの追加や編集ができない場合の対処法について紹介します。

原因

原因はいくつか考えられますが、特定のテーブルで編集コマンド(Insert, Update)のSQLにタイムアウトになる場合は以下の可能性があります。

テーブルがロックされている可能性

テーブルがロックされている可能性が高いです。何らかのきっかけでテーブルがロックされたままになっている可能性があります。

補足
データベースやサーバーを再起動してもロックは保持されるため、サーバーの再起動では解決しません。

統計情報の更新中の場合

多くのレコードを追加、更新した場合に統計情報の更新が発生し、データベースのパフォーマンスが下がっている状態の可能性があります。

対処法:テーブルがロックされている場合

ロックの状態を確認する

データベースのロック状態を確認します。下記のSQLを実行します。

select DB_NAME(resource_database_id),resource_type, request_type,request_session_id 
  from sys.dm_tran_locks

解説

sys.dm_tran_locks でロックされている要素の一覧を取得します。(sys.dm_tran_locks は現在アクティブなロック マネージャーのリソースを返します。)
resource_database_id は対象となる、データベースIDですが、ID番号ではどのデータベースか判別しづらいため、DB_NAME関数の引数に与えデータベース名に変換します。



結果は以下の表示となります。
特定のテーブルで Insert や Updateがタイムアウトする:画像1

結果の一覧から、編集のできないデータベース名の要素を探し "request_session_id" の番号を控えます。

プロセスの終了

kill コマンドを使用してプロセスを終了します。

書式

kill (プロセス番号)

先の例で、14行目のロックされている要素のプロセスを削除する場合は

kill 61

のSQLを実行します。

動作確認

プロセスを終了後、テーブルが書きこみ可能になっているか確認します。

対処法:統計情報が更新中の場合

統計情報の更新が完了するまで、しばらく時間を空けてから実行します。

AuthorPortraitAlt
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
作成日: 2014-11-02