1. ホーム
  2. sql

[解決済み] ロックエスカレーション - ここで何が起こっているのか?

2022-05-11 16:27:09

質問

SQL Server 2008 でテーブルを変更(列を削除)しているときに、[変更スクリプトの生成] ボタンをクリックすると、生成された変更スクリプトが列を削除して "go" と言い、さらに ALTER TABLE 文を実行して、テーブルのロック昇格を "TABLE" にセットしたように見えることに気づきました。例

ALTER TABLE dbo.Contract SET (LOCK_ESCALATION = TABLE)

また、これは変更スクリプトが最後に行っていることであることを記しておきます。ここで何をしているのか、なぜ LOCK_ESCALATION を TABLE に設定しているのか?

解決方法は?

をクリックします。 ロックエスカレーション "は、SQL が大規模な更新を行う際のロックの処理方法です。SQL が多くの行を変更する場合、データベースエンジンはより小さなもの(行ロックなど)を多くロックするのではなく、より小さな大きなロック(テーブル全体など)を取る方が効率的です。

しかし、巨大なテーブルがある場合、テーブル全体をロックすると、他のクエリーが長時間ロックされる可能性があるため、問題が生じることがあります。 また、複数のクエリがテーブルの異なる部分をロックしていると、あるプロセスが他のプロセスを待っているときにデッドロックが発生する可能性があります。

テーブルレベルのオプションがあります。 LOCK_ESCALATION SQL 2008 の新機能で、ロックのエスカレーションを制御することができます。 デフォルトの "TABLE"では、テーブル・レベルまでロックをエスカレートさせることが可能です。DISABLE は、ほとんどの場合、テーブル全体へのロック昇格を防ぎます。AUTOでは、テーブルがパーティション化されている場合を除き、テーブルのロックが許可され、この場合、ロックはパーティション・レベルまでしか行われません。参照 このブログの記事 をご覧ください。

SQL2008ではTABLEがデフォルトなので、テーブルを再作成する際にIDEがこの設定を追加しているのだと思われます。LOCK_ESCALATION は SQL 2005 ではサポートされていないので、2005 のインスタンスでスクリプトを実行する場合は、この設定を削除する必要があることに注意してください。また、TABLEはデフォルトなので、スクリプトを再実行する際にはこの行を削除しても大丈夫です。

また、この設定が存在する以前の SQL 2005 では、すべてのロックはテーブル・レベルまでエスカレートできたことに注意してください。