【问题标题】:Insert data into a huge table with Indexes使用索引将数据插入到一个巨大的表中
【发布时间】:2011-04-27 10:27:40
【问题描述】:

我需要插入数据,数据量非常大。我需要在此表上定义一些索引。所以,我的问题是……哪个更好,为什么

  1. 创建表 --> 插入数据 --> 创建索引
  2. 或者,创建表-->创建索引-->插入数据

谢谢, 瓦布斯

【问题讨论】:

标签: sql oracle


【解决方案1】:

选择 #1 会更快,因为从头开始构建索引比逐个添加记录更有效。这又是因为记录将被预先排序,并且索引块被填充并以有序的方式写入。在 oracle 中,您还可以使用“create index ... nologging”来避免创建重做日志。

【讨论】:

  • @Magnus:因为索引只会维护一次。如果索引在所有插入期间都存在,则每个 INSERT 语句都需要更新索引。为所有行“一次性”创建索引比每次插入一行时更新它的开销要少。
【解决方案2】:

当你建立一个索引时,oracle 可以在它的临时排序空间中对整个表进行排序,然后从中构建索引。

如果您已经建立了索引,那么对于插入的每一行,它必须在索引中查找新值所在的位置,然后将值添加到索引中。

所以加载数据然后构建索引要快得多

【讨论】:

    【解决方案3】:

    选择 #1通常会更快,但在某些情况下选择 #2 可能会更快 - 即您有多个 INSERT,并且一个或多个后续插入查询同一个表并使用一个或更多索引。

    当然,另一个考虑因素是在加载数据之前/期间是否会有来自其他会话的并发活动 - 如果它们没有索引可以利用,它们可能会受到影响。

    【讨论】:

      猜你喜欢
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 2015-09-01
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      相关资源
      最近更新 更多