要将NOT NULL列添加到具有许多记录的表中,需要应用DEFAULT约束.如果表非常大,则此约束会导致整个ALTER TABLE命令运行很长时间.这是因为:
假设:
- DEFAULT约束修改现有记录.这意味着db需要增加每条记录的大小,这会导致它将完整数据页上的记录转移到其他数据页,这需要时间.
- DEFAULT更新作为原子事务执行.这意味着需要增加事务日志,以便在必要时可以执行回滚.
- 事务日志跟踪整个记录.因此,即使只修改了一个字段,日志所需的空间也将基于整个记录的大小乘以现有记录的数量.这意味着向具有小记录的表添加列将比向具有大记录的表添加列更快,即使两个表的总记录数相同也是如此.
可能的解决方案:
- 把它吸干然后等待这个过程完成.只需确保将超时时间设置得很长.这样做的问题是,根据记录数量,可能需要数小时或数天才能完成.
- 添加列但允许NULL.然后,运行UPDATE查询以设置现有行的DEFAULT值.不要做UPDATE*.一次更新批量记录,否则您将遇到与解决方案#1相同的问题.这种方法的问题在于,当您知道这是一个不必要的选项时,最终会得到一个允许NULL的列.我相信有一些最佳实践文档说明你不应该有允许NULL的列,除非有必要.
- 使用相同的架构创建新表.将列添加到该架构.从原始表传输数据.删除原始表并重命名新表.我不确定这比#1更好.
问题:
- 我的假设是否正确?
- 这是我唯一的解决方案吗?如果是这样,哪一个是最好的?我不,我还能做什么?