索引使用
所有的DBA熟悉索引使用规则。我们都明白,我们应该区别对待建立索引的列-他们帮助oracle快速隔离结果集。此外,据我们了解,在你的SQL中索引的前导列应该匹配指定的搜索条件。鉴于上述指引,它只是似乎很自然,然后得出结论,在索引中最具差别的列应摆在其他列的前面。
这似乎很明显,最具差别的列一定能减少工作,因为如果采用“最优”列作为第一列,Oracle可以更有效地
识别。这个结论符合我们的实践。
令人惊讶的是,我们的直觉是错误的!
虽然索引中的前导列必须匹配sql条件是对的,一旦满足该条件,哪一列在前没有区别。我们的直觉是完全错误的!
怎么会这样?
在Tom Kyte的优秀著作《Expert Oracle Database Architecture: 9i and 10g Programming Techniques and Solutions 》中讨论了这个问题,通过测试,他证明了当非选择性列在索引的第一列时,oracle并未执行更多的工作,不幸的是他并未解释为什么。
这个问题的本质很简单:一旦oracle能够使用到索引,并没什么神奇的左边列。在oracle的算法中,当构建(或遍历)一个B+树分支时,已包含了起到重要作用的列。这是复合结构,它被用于指向B+树的下一个分支,并不仅仅一列。所以‘左’或‘右’并无特别的好处。
一个例子
考虑下面的索引:
INDEX1: (ZIP_CODE, GENDER)
INDEX2: (GENDER, ZIP_CODE)
假设我们正在寻找ZIP_CODE=94568 AND GENDER='Male'的组合。在oracle遍历索引前,它将会联合这两个条件,复合值类似94568_Male,与Male_94568有相同的辨别作用。