create index foo_ix on foo(a,b); create index foo_ix on foo(b,a);
>这如何影响使用索引的操作(运行时)特征?
>这如何影响索引的布局(物理)特征?
>(1)或(2)是否受列的类型/尺寸的影响?
>创建多列索引的最佳做法是什么?
总之,我把第一列放在哪里?
>具有最小不同值的列应为第一列,最后为最不相同的列。这不仅使索引的效用最大化,还增加了索引压缩的潜在收益。
>列的数据类型和长度对我们可以从索引压缩而不是索引中列的最佳顺序的返回有影响。
>首先排列最少选择性列的列,最后排列最多选择列。在领带的情况下,该列更容易被自己使用。
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操作的其他好处不太可能超过维护组合索引的开销。
当我们有:多列索引是最有用的:
>两列或更多列中等选择性,>它们在同一个查询中经常使用。