Ben*_*ada 12 null sql-server alter-table sql-server-2017
我最近在一个有近 5 亿行的表中添加了一个可以为 NULL 的位列。列上没有默认值,但是所有插入都指定了 0 或 1 的值,我运行了一个一次性例程,将 0 或 1 分配给所有现有行(小批量更新行)。现在每一行在该列中都应该有一个 0 或 1。
我想让位列不可为空,但是当我尝试通过 执行此操作时ALTER TABLE t1 ALTER COLUMN c1 bit not null
,它开始运行 3 分钟,然后我停止了它,因为它阻止了对表的所有读取,我怀疑它需要很长时间才能完成. 可能不会花太长时间,但我不能冒太多不可用的风险。回滚本身花了 6 分钟。
您对如何使列不可为空而不需要花费数小时才能完成有什么建议吗? 此外,有什么方法可以估计ALTER TABLE ALTER COLUMN
我开始然后取消的语句需要多长时间才能完成?
我使用的是 SQL Server 2017 网络版。
Joe*_*ish 12
您可以添加CHECK CONSTRAINT
不允许为该列使用 NULL的列定义,而不是更改列定义。该表仍然需要扫描,但不需要修改每个数据页,所以它应该是一个更快的操作。遗憾的是,手术过程中仍会持有Sch-M锁。一个技巧是在尝试添加约束之前尝试将尽可能多的表放入缓冲池。这可能会减少持有 Sch-M 锁的时间。
然后,您可以在下一个维护时段移除约束并更改列定义。
小智 11
如果您使用的是企业版 (EE),更好的策略可能是将其添加为NOT NULL
默认值0
或1
(以最常见的为准)。
这是EE 中的仅元数据更改。然后更新需要翻转的。这意味着更新更少,完成后无需更改列的可空性。-马丁史密斯