SQL Server でロックのエスカレーションが原因で発生するブロッキング問題を解決する
http://support.microsoft.com/?id=323630
■ロックエスカレーションが問題かどうかをまず判断
他のユーザーをブロックしているロックが S (共有) または X (排他) のロック モードを使用する TAB (テーブル レベル) ロック以外の場合、ロックのエスカレーションは問題ではありません。
特に、TAB ロックがインテント ロック (ロック モードが IS、IU、または IX など) の場合、これはロックのエスカレーションによるものではありません。
ブロッキング問題の原因がロックのエスカレーションではない場合、トラブルシューティングの手順ついては資料 224453 を参照。
http://support.microsoft.com/kb/224453/
問題であることが分かった場合は、下記①、②を試す
■ロックのエスカレーションを防止する方法①
ロックのエスカレーションを防止する最も簡単で安全な方法は、トランザクションを短くして、負荷の高いクエリのロックの使用状況を削減し、ロックのエスカレーションのしきい値を超えないようにすることです。
大規模なバッチ操作をいくつかの小さな操作に分けます。たとえば、次のクエリを実行して監査テーブルから数十万個の古いレコードを削除すると、このクエリが他のユーザーをブロックするロックのエスカレーションの原因となることがわかります。
レコードを一度に数百個ずつ削除することによって、トランザクションごとに累積するロックの数を大幅に削減し、ロックのエスカレーションを防止できます。
DELETE FROM LogMessages WHERE LogDate < '2/1/2002'
SET ROWCOUNT 500
delete_more:
DELETE FROM LogMessages WHERE LogDate < '2/1/2002'
IF @@ROWCOUNT > 0 GOTO delete_more
SET ROWCOUNT 0
■ロックのエスカレーションを防止する方法②
トレース フラグ 1211 を有効にして、ロックのエスカレーションを無効にできます。ただし、このトレース フラグは、SQL Server のインスタンスにあるすべてのロックのエスカレーション全体を無効にします。
ただし、ロックのエスカレーションは、数千のロックを取得および解放するオーバーヘッドにより速度が低下するクエリの効率を最大にするため、SQL Server の有用性が向上します。
サーバー起動時のパラメータを追加するには、SQL Enterprise Manager でサーバーを右クリックし、[プロパティ] をクリックします。次に、[全般] タブの [起動時のパラメータ] をクリックし、次のパラメータを正確に追加します。
-T1211
新しい起動時のパラメータを有効にするために SQL Server サービスを再開する必要があります。クエリ アナライザで次のクエリを実行すると、すぐにトレース フラグが有効になります。
DBCC TRACEON (1211, -1)
SQL Server 2005 Books Online ロックのエスカレーション
http://msdn2.microsoft.com/ja-jp/library/ms184286.aspx
SQL Server 2005 Books Online DBCC TRACESTATUS
http://msdn2.microsoft.com/ja-jp/library/ms187809.aspx
DBCC (Transact-SQL)
DBCC TRACEOFF (Transact-SQL)
DBCC TRACESTATUS (Transact-SQL)
トレース フラグ (Transact-SQL)