【问题标题】:bulk insert with or without index带或不带索引的批量插入
【发布时间】:2008-12-08 16:11:01
【问题描述】:

在我阅读的评论中

顺便说一句,有时删除表的索引并在批量插入操作后重新创建它们会更快。

这是真的吗?在什么情况下?

【问题讨论】:

    标签: sql-server performance bulkinsert


    【解决方案1】:

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

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

    所以它可以提供很大的帮助,但很多都归结为您的数据、索引和数据值的分布。

    【讨论】:

    • 我认为在我们的案例中,很大一部分原因是我们总是从一张空白表开始,并且大量数据以集群顺序出现。因此没有太多额外的工作要做。
    • 啊,是的,那将是其中的一个很好的部分。我们也总是从一张空白表开始,但输入数据到处都是!
    【解决方案2】:

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


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

    【讨论】:

    • 将新数据插入临时表,然后执行类似 INSERT INTO TABLE x (SELECT * FROM y) 之类的操作是否可行?根据数据库,可能涉及一些索引优化 - 或者我可能偏离了标记
    • 不,因为那时你正在做两次插入。当然,您的情况可能会有所不同,但总的来说这无济于事。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-21
      相关资源
      最近更新 更多