2009-11-09 125 views
110

在SQL Server 2008中更改表(删除列)时,我单击了“生成更改脚本”按钮,我注意到它生成的更改脚本将该列删除,并显示“go”,然后运行附加的ALTER TABLE语句将表格的锁定升级设置为“TABLE”。示例:锁定升级 - 这里发生了什么?

ALTER TABLE dbo.Contract SET (LOCK_ESCALATION = TABLE) 

我还应该注意,这是变更脚本正在做的最后一件事。这里做了什么,为什么将LOCK_ESCALATION设置为TABLE?

回答

141

Lock Escalation”是SQL如何处理大型更新的锁定。当SQL要改变很多行时,对于数据库引擎来说,更少的更大的锁(例如整个表)而不是锁定许多较小的事物(例如行锁)会更高效。

但是,当您有一个巨大的表时,这可能会产生问题,因为对整个表进行锁定可能会长时间锁定其他查询。这是一个折衷:许多小粒度锁比粗粒度锁少一些(或一个),并且有多个查询锁定表的不同部分会在一个进程正在等待另一个进程时造成死锁的可能性。

在SQL 2008中有一个表级选项LOCK_ESCALATION,它允许控制锁升级。默认的“TABLE”允许锁升级到表级。在大多数情况下,DISABLE可防止锁升级到整个表。除非表被分区,否则AUTO允许表锁,在这种情况下,锁仅由分区级构成。有关更多信息,请参见this blog post

我怀疑,因为表是在2008年的SQL注意默认是LOCK_ESCALATION没有SQL 2005中支持的IDE增加时重新创建表此设置,所以你需要剥去它,如果试图运行2005年实例上的脚本。另外,由于TABLE是默认值,因此在重新运行脚本时可以安全地删除该行。

还要注意的是,在2005年之前,SQL此设置存在,所有的锁会升级到换句话说表level--,“TABLE”是在SQL中唯一设置2005

+1

在MSDN论坛上重复的职位,以及:http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/e96aa19e-d72c-46af-b2e8-4bf54de09440 – 2009-11-09 21:13:00

+0

@JustinGrant:可以这样表达与“CREATE TABLE”语句结合使用? – 2013-03-28 14:16:38

+6

@dma_k - 此选项与“CREATE TABLE”无关,因为该表尚不存在,所以没有什么可以锁定。 – 2013-03-29 17:46:24

6

可以检查你需要通过前相比这个值和运行脚本的主体部分后,包括脚本中LOCK_ESCALATION声明:

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

在我的情况下,改变table删除或添加约束似乎没有修改这个值。

相关问题