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