【发布时间】:2008-12-08 16:11:01
【问题描述】:
在我阅读的评论中
顺便说一句,有时删除表的索引并在批量插入操作后重新创建它们会更快。
这是真的吗?在什么情况下?
【问题讨论】:
标签: sql-server performance bulkinsert
在我阅读的评论中
顺便说一句,有时删除表的索引并在批量插入操作后重新创建它们会更快。
这是真的吗?在什么情况下?
【问题讨论】:
标签: sql-server performance bulkinsert
与 Joel 一样,我会回应说是的,这可能是真的。我发现识别他提到的场景的关键在于数据的分布,以及您在特定表上拥有的索引的大小。
在我曾经支持的一个应用程序中,它定期批量导入 180 万行,表上有 4 个索引,1 个索引有 11 列,表中总共有 90 列。带索引的导入需要 20 多个小时才能完成。删除索引、插入和重新创建索引只需要 1 小时 25 分钟。
所以它可以提供很大的帮助,但很多都归结为您的数据、索引和数据值的分布。
【讨论】:
是的,这是真的。当插入期间表上有索引时,服务器将需要不断地重新排序/分页表以保持索引是最新的。如果您删除索引,它可以只添加行而无需担心,然后在您重新创建索引时一次性构建所有索引。
当然,例外情况是导入数据已经按索引顺序排列。事实上,我应该注意到我现在正在研究一个观察到这种相反效果的项目。我们希望减少大型导入(从大型机系统夜间转储)的运行时间。我们尝试删除索引、导入数据并重新创建它们。它实际上显着增加了导入完成的时间。但是,这并不典型。它只是表明您应该始终首先针对您的特定系统进行测试。
【讨论】:
删除和重新创建索引时应考虑的一件事是,仅应在数据库使用量低的自动化进程上执行此操作。当索引被删除时,它不能用于其他用户可能同时运行的其他查询。如果您在生产时间这样做,您的用户可能会开始抱怨超时。
【讨论】: