微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

甲骨文:索引中的列顺序是否重要?

可以使用任一语句创建两列上的索引
create index foo_ix on foo(a,b);
create index foo_ix on foo(b,a);

>这如何影响使用索引的操作(运行时)特征?
>这如何影响索引的布局(物理)特征?
>(1)或(2)是否受列的类型/尺寸的影响?
>创建多列索引的最佳做法是什么?

总之,我把第一列放在哪里?

>如果a和b都有1000个不同的值,并且它们总是被一起查询,则索引中的列的顺序并不重要。但是如果一个只有10个不同的值,或者你有一个查询只使用其中一个列,那么它是重要的;在这些情况下,如果列排序不适合查询,则索引可能不会被使用。
>具有最小不同值的列应为第一列,最后为最不相同的列。这不仅使索引的效用最大化,还增加了索引压缩的潜在收益。
>列的数据类型和长度对我们可以从索引压缩而不是索引中列的最佳顺序的返回有影响。
>首先排列最少选择性列的列,最后排列最多选择列。在领带的情况下,该列更容易被自己使用。

2.和3.的一个潜在的例外是DATE列。因为Oracle DATE列包含时间元素,因此它们每天可能具有86400个不同的值。但是,数据列上的大多数查询通常只对day元素感兴趣,因此您可能只想考虑计算中不同天数。虽然我怀疑这不会影响相对选择性,但少数情况下。

编辑(作为回应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)与(B,A)的18个相比,有20个可跳过的时隙。更广泛的差距会产生更大的投资回报率的索引压缩或更好的效用从Index Skip读取。

与大多数调谐启发式的情况一样,我们需要使用实际值和现实卷进行基准测试。这绝对是数据偏移可能对不同方法的有效性产生重大影响的场景。

“I think if you have a highly selective first index then – from a
performance perspective – you’ll do well to put it first.”

如果我们有一个高度选择性的列,那么我们应该建立一个自己的索引。避免在少数行上进行FILTER操作的其他好处不太可能超过维护组合索引的开销。

当我们有:多列索引是最有用的:

>两列或更多列中等选择性,>它们在同一个查询中经常使用。

原文地址:https://www.jb51.cc/oracle/205972.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐