我们有一个包含2.3B行的表。我们想将列从NOT NULL更改为NULL。该列包含在一个索引中(不是聚簇索引或PK索引)。数据类型没有变化(它是INT)。只是可空性。声明如下:
Alter Table dbo.Workflow Alter Column LineId Int NULL
在我们停止之前操作超过10(我们甚至还没有让它运行完成,因为它是一个阻塞操作并且花了太长时间)。我们可能会将表复制到开发服务器,测试实际需要多长时间。但是,我很好奇是否有人知道在从NOT NULL转换为NULL时SQL Server正在做什么?此外,受影响的索引是否需要重建?生成的查询计划并未指出发生了什么。
SQL Server 2008 R2
答案 0 :(得分:-1)
在取消之前你让它运行了多长时间? 2.3亿是一个很大的数字,需要时间。
您遇到阻塞的原因是因为SQL Server在更新表定义时将在WHOLE TABLE
上获取Schema Lock。
模式锁定,锁定整个表,甚至脏读也被阻止。
我建议,在最繁忙的时间执行Alter表语句并保持耐心,就像我之前所说的那样,20亿是一个很大的数字,这需要时间。
架构锁
数据库引擎在使用期间使用架构修改(Sch-M)锁定 表数据定义语言(DDL)操作,如添加一个 列或删除表。在它举行期间,Sch-M 锁防止并发访问表。这意味着Sch-M 锁定将阻止所有外部操作,直到锁定被释放。
一些数据操作语言(DML)操作,例如表 截断,使用Sch-M锁来防止访问受影响的表 并发操作。