Sql server 将列从NOTNULL转换为NULL。什么';引擎盖下发生了什么?

Sql server 将列从NOTNULL转换为NULL。什么';引擎盖下发生了什么?,sql-server,Sql Server,我们有一张有23亿行的桌子。我们希望将列从NOTNULL更改为NULL。该列包含在一个索引中(不是聚集索引或PK索引)。数据类型没有改变(它是一个INT)。只是可空性。声明如下: Alter Table dbo.Workflow Alter Column LineId Int NULL 在我们停止操作之前,该操作需要超过10秒的时间(我们甚至还没有让它运行到完成,因为它是一个阻塞操作,花费的时间太长)。我们可能会将该表复制到dev服务器,以测试实际需要多长时间。但是,我很好奇,是否有人知道SQ

我们有一张有23亿行的桌子。我们希望将列从NOTNULL更改为NULL。该列包含在一个索引中(不是聚集索引或PK索引)。数据类型没有改变(它是一个INT)。只是可空性。声明如下:

Alter Table dbo.Workflow Alter Column LineId Int NULL
在我们停止操作之前,该操作需要超过10秒的时间(我们甚至还没有让它运行到完成,因为它是一个阻塞操作,花费的时间太长)。我们可能会将该表复制到dev服务器,以测试实际需要多长时间。但是,我很好奇,是否有人知道SQL Server在从NOTNULL转换为NULL时在后台做什么?此外,是否需要重建受影响的索引?生成的查询计划没有指示发生了什么


SQL Server 2008 R2在取消之前让它运行了多长时间?23亿是个大数字,需要时间

出现某些阻塞的原因是,在更新表定义时,SQL Server将获得整个表的模式锁

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

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

模式锁定

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

一些数据操作语言(DML)操作,如表 截断时,使用Sch-M锁以防止 并发操作


Source

听起来更像是一个dba.stackexchange.com之类的问题……这意味着等待问题被迁移,请不要在那里发布相同的问题。这段时间太晚了,但请下次再考虑。这并不能告诉我SQLServer实际上在引擎盖下做了什么,将列转换为空的。它在表中获得了<代码>模式锁< /C> >进行表定义更新。你还需要什么信息?