Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle:在索引中,列顺序重要吗?_Oracle_Optimization_Indexing - Fatal编程技术网

Oracle:在索引中,列顺序重要吗?

Oracle:在索引中,列顺序重要吗?,oracle,optimization,indexing,Oracle,Optimization,Indexing,可以使用以下任一语句在两列上创建索引 create index foo_ix on foo(a,b); create index foo_ix on foo(b,a); 这如何影响使用索引的操作(运行时)特性 这如何影响索引的布局(物理)特征 柱的类型/尺寸是否影响(1)或(2) 创建多列索引的最佳实践是什么 简言之,我把哪个栏目放在第一位重要吗 如果列单独用于 查询Oracle将使用较少的 高效的跳过扫描索引访问 路径(如果不是前导列) 在索引中 取决于 反应的选择性 纵队 没有 我将查看涉

可以使用以下任一语句在两列上创建索引

create index foo_ix on foo(a,b);
create index foo_ix on foo(b,a);
  • 这如何影响使用索引的操作(运行时)特性

  • 这如何影响索引的布局(物理)特征

  • 柱的类型/尺寸是否影响(1)或(2)

  • 创建多列索引的最佳实践是什么

  • 简言之,我把哪个栏目放在第一位重要吗

  • 如果列单独用于 查询Oracle将使用较少的 高效的跳过扫描索引访问 路径(如果不是前导列) 在索引中
  • 取决于 反应的选择性 纵队
  • 没有
  • 我将查看涉及索引中的列的查询,并按查询量最大的列对它们在索引中的位置进行排序

  • 您可以在此处找到一些问题的答案:

  • 如果
    a
    b
    都有1000个不同的值,并且它们总是一起查询,那么索引中列的顺序实际上并不重要。但是如果
    a
    只有10个不同的值,或者您的查询只使用其中一列,那么它就很重要;在这些情况下,如果列顺序不适合查询,则可能不使用索引
  • 具有最小不同值的列应位于第一位,具有最大不同值的列应位于最后。这不仅使指数的效用最大化,还增加了指数压缩的潜在收益
  • 列的数据类型和长度会影响我们从索引压缩中获得的返回,但不会影响索引中列的最佳顺序
  • 首先排列选择最少的列,最后排列选择最多的列。如果连接导线与柱连接,则更可能单独使用 2的一个潜在例外。三,。包含日期列。因为Oracle日期列包含一个时间元素,所以它们每天可能有86400个不同的值。然而,对数据列的大多数查询通常只对日期元素感兴趣,因此您可能只考虑计算中不同日期的数量。虽然我怀疑它不会影响相对选择性,但在少数情况下

    编辑(回应Nick Pierpoint的评论)

    使用选择性最低的列进行引导的两个主要原因是

  • 索引压缩
  • 索引跳过读取
  • 这两种方法的神奇之处在于知道当前插槽中的值与前一个插槽中的值相同。因此,我们可以通过最小化价值变化的次数来最大化这些技术的回报。在下面的示例中,
    A
    有四个不同的值,
    B
    有六个不同的值。dittos表示可压缩值或可跳过的索引块

    Least selective column leads ...
    
    A          B
    ---------  -
    AARDVARK   1
    "          2
    "          3
    "          4
    "          5
    "          6
    DIFFVAL    1
    "          2
    "          3
    "          4
    "          5
    "          6
    OTHERVAL   1
    "          2
    "          3
    "          4
    "          5
    "          6
    WHATEVER   1
    "          2
    "          3
    "          4
    "          5
    "          6
    
    最有选择性的专栏导语

    B  A
    -  --------
    1  AARDVARK
    "  DIFFVAL
    "  OTHERVAL
    "  WHATEVER
    2  AARDVARK
    "  DIFFVAL
    "  OTHERVAL
    "  WHATEVER
    3  AARDVARK
    "  DIFFVAL
    "  OTHERVAL
    "  WHATEVER
    4  AARDVARK
    "  DIFFVAL
    "  OTHERVAL
    "  WHATEVER
    5  AARDVARK
    "  DIFFVAL
    "  OTHERVAL
    "  WHATEVER
    6  AARDVARK
    "  DIFFVAL
    "  OTHERVAL
    "  WHATEVER
    
    即使在这个平凡的例子中,
    (A,B)
    也有20个可跳过的插槽,而
    (B,A)
    只有18个。更大的差异将在索引压缩上产生更大的ROI,或者从索引跳过读取中产生更好的效用

    与大多数优化启发式一样,我们需要使用实际值和实际体积进行基准测试。在这种情况下,数据倾斜可能会对不同方法的有效性产生巨大影响


    “我认为,如果你有一个高度选择性的第一个指数,那么-从 从性能角度看——你最好把它放在第一位。”

    如果我们有一个高度选择性的列,那么我们应该建立它自己的索引。避免对少数行执行筛选操作的额外好处不太可能被维护复合索引的开销所抵消

    多列索引在以下情况下最为有用:

    • 两个或多个中等选择性色谱柱
    • 在同一查询中经常使用的

    但根据Oracle本身的说法,最好将基数最高的列放在第一位:

    复合索引的排序键


    如果在WHERE子句中使用所有键的频率相同,则在CREATE INDEX语句中将这些键从选择性最高的键排列到选择性最低的键,可以最好地提高查询性能。

    Hi。我不清楚你的第四点。你能解释一下吗?一般来说,我会把最有选择性的列放在第一位。当我认为直方图可能会有效地导致CBO完全跳过索引时,我只将选择性最低的列放在第一位。感谢额外的编辑APC-清楚地表达了您的观点。你关于需要基准测试的评论做得很好。我认为如果你有一个高度选择性的第一个索引,那么从性能的角度来看,你最好把它放在第一位。基准。。。基准。。。基准测试…和往常一样,答案是“这取决于”:取决于是使用Oracle9i+还是旧版本;关于列的基数和索引表的典型使用场景。请查看为较新Oracle版本编写的文档:您引用的要点在较新版本中不存在(我链接了11g),可能是因为出现了索引跳过扫描。