oracle索引 必须 顺序,索引列:为什么顺序无关紧要

索引使用

所有的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有相同的辨别作用。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值