【问题标题】:Oracle multicolumn index more columns or more indexes is betterOracle多列索引更多列或更多索引更好
【发布时间】:2019-01-08 21:53:10
【问题描述】:

当考虑 oracle 中的多列索引时,将更多列放入索引而不是更少列是更好的选择。即我有一个超过 20 列的表,选项 A 是使用 col_1、col_2、col_3 创建 index_1a 和使用 col_1、col_4、col_5 创建 index_1b。可以用 col_1, col_2, col_4 添加更多 index_1c 选项 B 是使用 col_1、col_2、col_3、col_4、col_5 创建 index_b

我有很多查询搜索不同的 col 组合,

  • 有时是 col_1 和 col_2
  • 有时是 col_1 和 col_4
  • 有时 col_1 和 col_2 和 col_4

我该怎么办?你们能不能解释一下。

【问题讨论】:

    标签: sql oracle performance indexing


    【解决方案1】:

    Oracle实现了skip-scan索引操作,解释here

    因此,在(col_1, col_2, col_4)(col_1, col_4, col_2) 上有一个索引可能就足够了。您应该测试一下性能是否足以满足您的目的,但单个索引很有可能满足您的需求。

    【讨论】:

      【解决方案2】:

      Oracle 通常不会组合多个索引(假设问题与 b*tree 索引有关,而不是与位图索引有关)——大多数时候优化器只会使用最合适的索引。在您的示例中,第一个问题是条件的选择性:如果 col_1 非常有选择性,那么 col_1 上的索引可能就足够了。如果仅条件组合提供了良好的选择性,则可能需要创建多个索引 - 在这种情况下,您可以在示例中以 (col_1, col_2, col_4) 和 (col_1, col_4) 结尾。如果您的第二个示例查询只有索引 (col_1, col_2, col_4),我希望优化器仅使用 col_1 作为访问谓词和 col_4 作为过滤谓词。当然,添加多个索引会带来 DML 发生时维护索引的工作量增加的成本。

      使用位图索引,优化器可以将它们组合起来,但是这种索引类型通常只用于数据仓库,因为它会给并发 DML 带来大量锁定问题。

      【讨论】:

        猜你喜欢
        • 2011-09-16
        • 2020-05-06
        • 2013-11-05
        • 1970-01-01
        • 2011-11-07
        • 2010-09-15
        • 2019-12-06
        • 1970-01-01
        相关资源
        最近更新 更多