添加列是否在SQL Server 2008中锁定表?

Eli*_*Eli 3 sql sql-server sql-server-2008

我想在大约1200万条记录的表格上运行以下内容.

ALTER TABLE t1
ADD c1 int NULL;
ALTER TABLE t2
ADD c2 bit NOT NULL
DEFAULT(0);
Run Code Online (Sandbox Code Playgroud)

我已经在分段中完成了它并且时间似乎很好,但在我在生产中进行之前,我想知道在创建新列时锁定是如何工作的(特别是当指定了默认值时).那么,有人知道吗?整个表是否被锁定,或者在默认值插入期间逐行锁定行?或者完全不同的事情发生了吗?

Rem*_*anu 10

在SQL Server 11(Denali)之前,使用默认值添加非空列将在后台运行更新以填充新的默认值.因此,它将在1200万行更新期间锁定表.在SQL Server 11中不再是这种情况,该列是在线添加的,并且不会发生更新,请参阅SQL Server 11中的带有值列的在线非NULL.

在SQL Server 11和之前都在表上获取Sch-M锁以修改定义(添加新列元数据).此锁与任何其他可能的访问(包括脏读)不兼容.不同之处在于持续时间:在SQL Server 11之前,此锁将保持数据大小操作(更新12M行).在SQL Server 11中,锁仅用于简短的简要说明.在SQL Server 11之前的行更新中,不需要获取行锁,因为表上的Sch-M锁保证任何单个行都不会发生任何冲突.

  • +1 - 总是很高兴从内部人员那里获得洞察力 (2认同)

Dam*_*ver 5

是的,它将锁定表格。

整个表具有单个架构(一组列以及相关的类型)。因此,至少需要一个模式锁来更新表的定义。


尝试考虑事情将如何相反地工作-如果每一行分别进行更新,那么任何并行查询将如何工作(特别是如果它们涉及新列)?


而且默认值仅在INSERTDDL和DDL语句期间有用-因此,如果为10,000,000行指定新的默认值,则必须将该默认值应用于所有这些行。


JNK*_*JNK 5

是的,它将锁定。

DDL语句发出模式锁定(请参阅此链接),该操作将阻止对该表的访问,直到操作完成。

真的没有办法解决这个问题,考虑一下就有意义。SQL需要知道一个表中有多少个字段,并且在此操作过程中,某些行将比其他行具有更多的字段。

另一种方法是使用正确的字段制作一个新表,插入到表中,然后重命名表以换出它们。