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);
您可以在此处找到一些问题的答案:
a
和b
都有1000个不同的值,并且它们总是一起查询,那么索引中列的顺序实际上并不重要。但是如果a
只有10个不同的值,或者您的查询只使用其中一列,那么它就很重要;在这些情况下,如果列顺序不适合查询,则可能不使用索引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,或者从索引跳过读取中产生更好的效用
与大多数优化启发式一样,我们需要使用实际值和实际体积进行基准测试。在这种情况下,数据倾斜可能会对不同方法的有效性产生巨大影响
“我认为,如果你有一个高度选择性的第一个指数,那么-从 从性能角度看——你最好把它放在第一位。” 如果我们有一个高度选择性的列,那么我们应该建立它自己的索引。避免对少数行执行筛选操作的额外好处不太可能被维护复合索引的开销所抵消 多列索引在以下情况下最为有用:
- 两个或多个中等选择性色谱柱
- 在同一查询中经常使用的
如果在WHERE子句中使用所有键的频率相同,则在CREATE INDEX语句中将这些键从选择性最高的键排列到选择性最低的键,可以最好地提高查询性能。Hi。我不清楚你的第四点。你能解释一下吗?一般来说,我会把最有选择性的列放在第一位。当我认为直方图可能会有效地导致CBO完全跳过索引时,我只将选择性最低的列放在第一位。感谢额外的编辑APC-清楚地表达了您的观点。你关于需要基准测试的评论做得很好。我认为如果你有一个高度选择性的第一个索引,那么从性能的角度来看,你最好把它放在第一位。基准。。。基准。。。基准测试…和往常一样,答案是“这取决于”:取决于是使用Oracle9i+还是旧版本;关于列的基数和索引表的典型使用场景。请查看为较新Oracle版本编写的文档:您引用的要点在较新版本中不存在(我链接了11g),可能是因为出现了索引跳过扫描。