如何优化插入行和创建索引?

时间:2016-01-08 16:12:25

标签: sql-server

我有一张超过十亿行的表。我想基本上有这个表的副本,但是我需要用较小的块添加记录并从最新的记录开始。我希望总操作的时间最短(创建表,插入行,创建索引)。

源和目标都有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:收缩日志

另请参阅:TSql, building indexes before or after data input

1 个答案:

答案 0 :(得分:0)

一块一块地移动记录结果非常长,有或没有索引,所以这个选项被抛弃了。此外,当我们尝试它时,我们的事务日志的磁盘空间变得庞大,并使大多数查询失败。

我们最终做的是按照建议使用SQL批量传输工具,新表没有索引。对于十亿+行,这花了大约一个小时。然后重新创建索引每个只需几分钟。

相关问题