将列从NOT NULL转换为NULL。引擎盖下发生了什么?

时间:2015-04-13 17:53:19

标签: sql-server

我们有一个包含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

1 个答案:

答案 0 :(得分:-1)

在取消之前你让它运行了多长时间? 2.3亿是一个很大的数字,需要时间。

您遇到阻塞的原因是因为SQL Server在更新表定义时将在WHOLE TABLE上获取Schema Lock。

模式锁定,锁定整个表,甚至脏读也被阻止。

我建议,在最繁忙的时间执行Alter表语句并保持耐心,就像我之前所说的那样,20亿是一个很大的数字,这需要时间。

架构锁

  

数据库引擎在使用期间使用架构修改(Sch-M)锁定   表数据定义语言(DDL)操作,如添加一个   列或删除表。在它举行期间,Sch-M   锁防止并发访问表。这意味着Sch-M   锁定将阻止所有外部操作,直到锁定被释放。

     

一些数据操作语言(DML)操作,例如表   截断,使用Sch-M锁来防止访问受影响的表   并发操作。

来源Lock Modes