我想在大约 1200 万条记录的表上运行以下命令。
ALTER TABLE t1
ADD c1 int NULL;
ALTER TABLE t2
ADD c2 bit NOT NULL
DEFAULT(0);
我已经在暂存中完成了它,并且时机似乎很好,但在生产中执行此操作之前,我想知道在创建新列期间锁定如何在表上工作(特别是在指定默认值时)。那么,有人知道吗?是整个表被锁定,还是在默认值插入过程中一行一行被锁定?或者是否发生了完全不同的事情?
在 SQL Server 11 (Denali) 之前,添加具有默认值的非空列将在幕后运行更新以填充新的默认值。因此,它将在 1200 万行更新期间锁定表。在 SQL Server 11 中不再是这种情况,列是在线添加的并且不会发生更新,请参阅在 SQL Server 11 中添加值列的在线非 NULL http://rusanu.com/2011/07/13/online-non-null-with-values-column-add-in-sql-server-11/.
在 SQL Server 11 和之前的版本中,都会在表上获取 Sch-M 锁以修改定义(添加新列元数据)。此锁与任何其他可能的访问(包括脏读)不兼容。区别在于持续时间:在 SQL Server 11 之前,此锁将针对数据大小操作(更新 12M 行)而保持。在 SQL Server 11 中,锁定仅保留很短的时间。在 SQL Server 11 之前的行更新中,不需要获取行锁,因为表上的 Sch-M 锁保证任何单个行上不会出现任何冲突。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)