現在、SQL Server 2008 の特定のユーザー テーブルで頻繁にデッドロックが発生するという問題があります。この特定のテーブルに関するいくつかの事実を次に示します。
- 行数が多い (100 万から 200 万)
- このテーブルで使用されるすべてのインデックスには、オプションで「行ロックを使用する」のみがチェックされています 編集: テーブルには主キーであるインデックスが 1 つしかありません
- 行は複数のトランザクションによって頻繁に更新されますが、一意です (たとえば、1 時間ごとに異なる一意の行に対しておそらく 1000 以上の更新ステートメントが実行されます)。
- テーブルはパーティションを使用しません。
の表を確認したところ、が に設定されsys.tables
ていることがわかりました。lock_escalation
TABLE
このテーブルの lock_escalation を変更したいと強く思っていますがDISABLE
、これがどのような副作用をもたらすかはよくわかりません。私が理解していることから、使用DISABLE
するとレベルからのエスカレートするロックが最小限に抑えられTABLE
、インデックスの行ロック設定と組み合わせると、理論的には遭遇しているデッドロックを最小限に抑えることができます..
Determining threshold for lock escalationで読んだことから、単一のトランザクションが 5000 行をフェッチすると、ロックが自動的にエスカレートするようです。
この意味で、単一のトランザクションは何を意味するのでしょうか? 個々の更新/選択ステートメントを介して 5000 行を取得する単一のセッション/接続?
それとも、5000 行以上をフェッチする単一の SQL 更新/選択ステートメントですか?
洞察をいただければ幸いです。ところで、n00b DBA はこちら
ありがとう