带或不带索引的批量插入

时间:2008-12-08 16:11:01

标签: sql-server performance bulkinsert

在评论中我读了

  

正如旁注所示,删除表的索引并在批量插入操作后重新创建它们有时会更快。

这是真的吗?在哪种情况下?

3 个答案:

答案 0 :(得分:8)

与乔尔一样,我会回应这样的说法:是的,这可能是真的。我发现识别他提到的场景的关键在于数据的分布以及特定表上的索引的大小。

在我曾经支持的应用程序中,定期批量导入180万行,表中有4个索引,1列有11列,表中总共有90列。索引导入需要20多个小时才能完成。删除索引,插入和重新创建索引只需要1小时25分钟。

所以这可能是一个很大的帮助,但很多都归结为你的数据,索引和数据值的分布。

答案 1 :(得分:6)

是的,这是真的。当插入期间表上有索引时,服务器将需要不断地重新排序/分页表以使索引保持最新。如果删除索引,只需添加行而不必担心,然后在重新创建索引时立即构建索引。


当然,例外情况是导入数据已经按索引顺序排列。事实上,我应该注意到我现在正在开展一个项目,其中观察到了相反的效果。我们希望减少大型导入的运行时间(从大型机系统每晚转储)。我们尝试删除索引,导入数据并重新创建它们。它实际上显着增加了导入完成的时间。但是,这不典型。它只是表明你应该总是先测试你的特定系统。

答案 2 :(得分:2)

在删除和重新创建索引时,您应该考虑的一件事是,它应该只在数据库使用的低容量期间运行的自动化进程上完成。当索引被删除时,它不能用于其他用户可能同时运行的其他查询。如果您在生产时间执行此操作,您的用户可能会开始抱怨超时。