[解決済み] ロックエスカレーション - ここで何が起こっているのか?
質問
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 では、すべてのロックはテーブル・レベルまでエスカレートできたことに注意してください。
関連
-
plsql-stored-procedure ORA-06550 エラー処理
-
[解決済み] SQL Serverで実行中の合計を計算する
-
[解決済み] 1つのPostgreSQLクエリで複数のWITHステートメントを使用するには?
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] SQL Serverにおける関数とストアドプロシージャの比較
-
[解決済み] ある列の最大値を持つ行を取得する
-
[解決済み] SQL Server 2008を使用してIDENTITY_INSERTをオン/オフする方法は?
-
[解決済み] Entity Framework VS LINQ to SQL VS ADO.NETでストアドプロシージャを使う?[クローズド]
-
[解決済み] SQL Serverで、ある日付より大きいすべての日付を照会するにはどうすればよいですか?
-
[解決済み] SQL Serverで、1つのALTER TABLEステートメントで複数のカラムをDROPする方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MHAクラスタエラーサマリーの構築
-
[解決済み] ストアドプロシージャ 'dbo.aspnet_CheckSchemaVersion' が見つかりませんでした。
-
[解決済み] SQL Server FOR EACH ループ
-
[解決済み] ...値に挿入する ( SELECT ... FROM ... )
-
[解決済み] INNER JOINよりもCROSS APPLYを使用すべきなのはどのような場合ですか?
-
[解決済み] カラム名の変更 SQL Server 2008
-
[解決済み] postgres: ユーザーをスーパーユーザーにアップグレードしますか?
-
[解決済み] 文字列の一部をUPDATEおよびREPLACEする。
-
[解決済み] 項目xにアクセスできるように文字列を分割するにはどうすればよいですか?
-
[解決済み] Count()で条件を指定することは可能ですか?