我知道这个问题有很多主题,但我一直在寻求更多的见解。
我有一个包含十亿多条记录的大表。记录的数量可以减少和存档,但大小仍然很大。我的任务是更改单个列的现有数据类型,其中旧数据值可以安全地转换为类型。
以下是我的一些方法:
1 - 删除影响目标列的表约束,删除也影响目标列的索引,在表末尾添加一个带有 NULL 的新列,用 10K 块的旧列值更新新列, 50K 或 100K 增量,在复制数据后删除旧列并仅为该列重新应用索引。
2 - 将所有数据复制到新表中,数据类型像以前一样以块的形式更改,验证数据是否完成,删除旧表,将新表重命名为旧表并应用索引。
3 - 使用 BULK INSERT 和 MERGE SP 将来自另一个数据源(如平面文件)的所有数据导入到新表中,数据类型发生变化,基本上类似于选项 2,有 2 个重复表,验证数据,删除旧表以替换为新表和应用索引。
什么是最快和最安全的选择?还有其他我没有考虑的选择吗?我已经使用选项 1 很好地更新了其他表的 1 亿条记录。表越大,由于更新的持续时间,选项 1 变得越难。
我一直选择选项#2,并且这样做的方式对系统的影响最小,因为它总是假设该应用程序将连续运行,或者最多运行 30 分钟。因此,我将构建新表并在一周内将数据缓慢迁移到其中。我会使用 SQL 代理作业来插入行,并使用
AFTER UPDATE, DELETE
触发器来保持已迁移的行同步。我在 SQL Server Central 上的一篇文章中详细介绍了这种方法:在几秒钟内重构 1 亿行(或更多)表。SRSLY!.