2009-11-09 20 views
110

SQL Server 2008でテーブルを変更(列を削除)しているときに、[変更スクリプトの生成]ボタンをクリックして、生成した変更スクリプトが列を削除し、「go」と表示され、表のロック・エスカレーションを「TABLE」に設定します。例:ロックエスカレーション - ここで何が起こっていますか?

ALTER TABLE dbo.Contract SET (LOCK_ESCALATION = TABLE) 

これは変更スクリプトが最後に行うことです。ここで何をやっているのですか?LOCK_ESCALATIONをTABLEに設定しているのはなぜですか?

答えて

141

"Lock Escalation"は、SQLが大きな更新のロックを処理する方法です。 SQLが多くの行を変更する場合、データベースエンジンは多くの小さなもの(たとえば行ロック)をロックするのではなく、より少ないロック(たとえばテーブル全体)をとる方が効率的です。

しかし、テーブル全体をロックすると他のクエリが長期間ロックアウトされる可能性があるため、巨大なテーブルを使用すると問題になることがあります。これはトレードオフです:小規模ロックの多くは粗ロックよりも遅く、テーブルの異なる部分をロックする複数のクエリを持つと、あるプロセスが別のプロセスを待機している場合にデッドロックが発生する可能性があります。

テーブルレベルのオプションLOCK_ESCALATION(SQL 2008の新機能)では、ロックのエスカレーションを制御できます。デフォルトの "TABLE"では、ロックをテーブルレベルまでエスカレートすることができます。 DISABLEは、ほとんどの場合、テーブル全体へのロックエスカレーションを防ぎます。 AUTOでは、表がパーティション化されている場合を除いて表ロックが許可されます。この場合、ロックはパーティション・レベルでのみ作成されます。詳細は、this blog postを参照してください。

テーブルがSQL 2008のデフォルトであるため、テーブルを再作成するときにIDEがこの設定を追加すると思われます.LOCK_ESCALATIONはSQL 2005ではサポートされていないため、実行しようとするとストリップする必要があります2005年のインスタンスのスクリプト。また、TABLEがデフォルトであるため、スクリプトを再実行するときに、その行を安全に削除することができます。

はまた、この設定が存在していた前に、SQL 2005年に、すべてのロックは、他の言葉でテーブルlevel--にエスカレートでき、ことに注意して、「TABLEは、」あなたはあなたのかどうかを確認することができますSQL 2005

+1

MSDNフォーラムの重複した投稿も同様です。http://social.msdn.microsoft.com/Forums/en/US/sqldatabaseengine/thread/e96aa19e-d72c-46af-b2e8-4bf54de09440 –

+0

@JustinGrant:この式'CREATE TABLE'文と組み合わされますか? –

+6

@dma_k - このオプションは、テーブルがまだ存在しないためにロックするものがないので、 'CREATE TABLE'には関係ありません。 –

6

上のみの設定でしたこれを変更していないよう落としたり、制約を追加するテーブルを変更し、私の場合は

SELECT lock_escalation_desc FROM sys.tables WHERE name='yourtablename' 

:前にこの値を比較することで、メインスクリプトの一部を実行した後にスクリプト内LOCK_ESCALATIONステートメントを含める必要があり値。

関連する問題