2016-01-08 23 views
0

我有一张超过10亿行的表格。我想基本上有这张表的副本,但是我需要通过较小的块添加记录并从最新的记录开始。我希望有最短的时间进行总操作(创建表,插入行,创建索引)。如何优化插入行和创建索引?

源和目标具有3个指标:

1 =群集(column1的ASC,列2 ASC)

2 =非唯一非聚集(列2 ASC,栏3 ASC)

3 =非唯一非群集(Column4 ASC,Column5 ASC)

我想插入由Column1 DESC排序的我的列。在90%的情况下,Column1是唯一的,大约9%的情况下少于5个重复。 Column1 + Column2始终是唯一的。如果它可以帮助优化,我可以在其他列上添加排序,但是我必须先通过Column1 DESC开始排序。

所以我想知道最快的过程应该是什么。请注意,我的插入将以大块(大概100万)完成。我目前的计划是这样的:

1:不带指数

2创建表:由大块,ORDER BY列1 DESC插入数据。每个块包含在BEGIN-COMMIT/ROLLBACK TRANSACTION块中。这是在一个定期的SQL作业调用的存储过程中。

3:在每个X块之后,收缩数据库日志。这是为了防止磁盘空间被炸毁。

4:创建索引#1

5:创建索引#2

6:创建索引#3

7:收缩日志

参见:TSql, building indexes before or after data input

+0

十亿行??? – i486

+0

作为SQL Server中重复过程的一部分收缩通常不是一个好主意。如果您正在使用'FULL'恢复模式并在频繁的时间间隔内(例如,使用按计划运行的代理程序作业)进行事务日志备份,则您将防止日志变得过大*,而不会*缩小。 – alroc

+0

@alroc很高兴知道,谢谢。我忘了提及我计划将插入作为SQL作业调用的存储过程来运行。基于这一点以及你所说的话,我不应该在X插入后收缩日志,我最终应该只做一次。 –

回答

0

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

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