在加载大量数据然后重新创建索引之前删除索引是否更有效?

时间:2014-04-03 07:55:18

标签: sql oracle

我从书Use The Index

中读到了这些句子
  

然而,没有索引的性能是如此之好,以至于在加载大量数据时临时删除所有索引是有意义的 - 同时任何其他SQL语句都不需要索引。这可以释放出图表中可见的显着加速,实际上是数据仓库中的常见实践。

我可以理解,在将数据插入空表之后创建索引是更有效的方法。但是,尽管将数据插入索引表的速度较慢,但​​我认为重新创建索引也非常昂贵。

所以我的问题是,在插入之前表中是否存在大量的行时,它是否也更快?如果是,那么新行的比例是多少?如何定义' Large'?

2 个答案:

答案 0 :(得分:2)

这取决于。唯一可以确定的方法是使用您的(测试)数据和您的(测试)环境进行试用。

答案 1 :(得分:2)

正如其他人所说,“这取决于”。但值得解释的是,为什么这么看似简单的问题是如此复杂。

除了添加数据的百分比外,还有许多因素需要考虑:

  1. 什么样的索引?位图,反向键,压缩,域?
  2. 有多少个索引,它们有多少列,列的大小是多少,块大小是多少?
  3. 插入数据的排序方式如何?
  4. 可以并行重建索引吗?
  5. 缓冲区缓存(内存)中可以容纳多少数据?
  6. 什么是统计信息收集策略,可以使用cascade =>运行统计信息假?
  7. 解释计划可能会回答这个问题的一半。它可用于预测构建索引的时间。但是时间估计非常糟糕,Oracle甚至没有尝试估算INSERT STATEMENT的成本。
  8. 还有其他问题我没有想到。