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锁保证任何单个行都不会发生任何冲突.
是的,它将锁定表格。
整个表具有单个架构(一组列以及相关的类型)。因此,至少需要一个模式锁来更新表的定义。
尝试考虑事情将如何相反地工作-如果每一行分别进行更新,那么任何并行查询将如何工作(特别是如果它们涉及新列)?
而且默认值仅在INSERT
DDL和DDL语句期间有用-因此,如果为10,000,000行指定新的默认值,则必须将该默认值应用于所有这些行。
归档时间: |
|
查看次数: |
6617 次 |
最近记录: |