这个事情源于我前阵子做一个数据迁移时遇到的惨痛经历。几个月前我们生产环境有张10几亿行数据的表因为自增列是INT类型,数据类型需要改成BIGINT,只能迁移数据到新表后通过重命名表的方式来实现表迁移。这个我在另外一篇博文SQL Server ->> 谈SQL Server数据库大表迁移中有谈到。这里主要谈过程中我遇到的问题。
其实这个问题准确来说是三种选择,而不是题目的两种。应该是:到底是:1、先建索引再全表插入数据;2、先插入数据再建索引;3、先建索引,再批次插入数据
先建索引再全表插入数据:
这是三者风险最高和时间消耗最高的一种选择,绝对是。先说风险性,整个表的数据一次性插入,整个事务大小级别是极其恐怖的(假设表数据量非常大,而且索引还不少),风险性极高,一旦出现问题,整个回滚的时间是完全不可预期的。你可以想象这个过程要耗费多少系统资源:
1、事务日志会按插入数据量增长,等同于日志文件大小增量只是是表数据写入数据量的大小,假设你的数据本身是100G,那你要保证你的事务日志磁盘空间至少要大于100G;
2、数据插入过程SQL SERVER不仅要把申请数据本身的内存空间,还需要申请索引本身所需的内存空间,也就是SQL SERVER一遍插入数据,一遍还要维护索引。这个时候系统资源压力最大的,我觉得是内存。
3、