出于某种原因,我需要从" NOT NULL"更新我的一个表列。到" NULL"。 命令很简单:
ALTER TABLE TBLOGDOCMESSAGE ALTER COLUMN PROCESSID BIGINT NULL
问题是该命令需要花费很多时间才能运行。我的表包含大约30M的寄存器(但我的数据中心可能有超过120M的寄存器)。 该列上有一个非聚集索引,不是FK。
有一种方法可以加速SQLServer 2008中的命令吗?
答案 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
索引在这里可能更快,或者至少值得尝试(在安全的环境中:)。