SqlServer性能Alter列从非null到null

时间:2014-05-28 12:34:44

标签: sql sql-server sql-server-2008

出于某种原因,我需要从" NOT NULL"更新我的一个表列。到" NULL"。 命令很简单:

ALTER TABLE TBLOGDOCMESSAGE ALTER COLUMN PROCESSID BIGINT NULL

问题是该命令需要花费很多时间才能运行。我的表包含大约30M的寄存器(但我的数据中心可能有超过120M的寄存器)。 该列上有一个非聚集索引,不是FK。

有一种方法可以加速SQLServer 2008中的命令吗?

2 个答案:

答案 0 :(得分:3)

我认为,删除索引可能会加快脚本速度。更改后,重新创建索引。

答案 1 :(得分:3)

一个重要的教训是存在NULL位图。

  

NULL位图将始终存在于表中(堆或群集)   表)无论表是否具有NULLable列或NOT。   请注意,我们在LastName + FirstName中定义了一个UNIQUE约束   演示2和UNIQUE约束使用UNIQUE INDEX强制执行   列。 NULL位图不会出现在NON-CLUSTERED INDEX中   索引定义的所有列部分都定义为NOT NULL。   在我们的例子中,LastName + FirstName都被定义为NOT NULL   表,这就是为什么NULL位图最初不存在的原因。什么时候我们   改变了表定义,在这种情况下操作必须触摸   桌子的每一行,这就是它昂贵的原因   操作。 (link

因为您的列也有非聚集索引,所以NULL位图尚不存在 所以我认为dropping非聚集索引,然后发出ALTER TABLE语句和recreating索引在这里可能更快,或者至少值得尝试(在安全的环境中:)。