我有一张超过十亿行的表。我想基本上有这个表的副本,但是我需要用较小的块添加记录并从最新的记录开始。我希望总操作的时间最短(创建表,插入行,创建索引)。
源和目标都有3个索引:
1 =聚集(Column1 ASC,Column2 ASC)
2 =非唯一非聚集(Column2 ASC,Column3 ASC)
3 =非唯一非聚集(Column4 ASC,Column5 ASC)
我想插入Column1 DESC排序的列。在90%的情况下,Column1是唯一的,在大约9%的情况下,少于5个重复。 Column1 + Column2始终是唯一的。如果它有助于优化,我可以在其他列上添加排序,但我必须首先按Column1 DESC开始排序。
所以我想知道最快的过程应该是什么。请注意,我的插入将以块(可能是100万)完成。我目前的计划如下:
1:创建没有索引的表
2:按块,ORDER BY Column1 DESC插入数据。每个块包含在BEGIN-COMMIT / ROLLBACK TRANSACTION块中。这是在SQL作业定期调用的存储过程中。
3:在每个X块之后,缩小数据库日志。这是为了防止磁盘空间爆炸。
4:创建索引#1
5:创建索引#2
6:创建索引#3
7:收缩日志
答案 0 :(得分:0)
一块一块地移动记录结果非常长,有或没有索引,所以这个选项被抛弃了。此外,当我们尝试它时,我们的事务日志的磁盘空间变得庞大,并使大多数查询失败。
我们最终做的是按照建议使用SQL批量传输工具,新表没有索引。对于十亿+行,这花了大约一个小时。然后重新创建索引每个只需几分钟。