|
原帖由 biti_rainy 于 2002-12-27 10:29 发表 ![]()
首先oracle 肯定不会是使用多个索引来掩盖问题的本质,那现在请允许我
假设索引(a,b,c)
我猜测是索引b或者c也有一个相临值之间的 “地址指针”
但他们之间是否具有树型结构不清楚
若不具有树结构则每次从该a 不同值进入从第一个b 值开始寻找符合条件数据
若具有树结构则每次进入一个a然后就迅速定位到符合条件b值
这样可能对每一个a值都要进入一次
我这样猜测
那么就可以通过控制a 或者 b值的数据分布和符合条件比例来逐步证明自己的猜测是否正确
举个例子
假设数据分布:
a b c
1 1 1
1 2 2
1 2 3
1 3 1
2 1 1
2 2 2
2 2 3
当查询 b = 2 的时候
不存在树结构: 先进入a=1, 然后顺序((也可2分法等方法,因为是排序好的)
)b=1,b=2,发现2条,不用比较3了,因为是有序的
存在树结构: 进入a= 1 ,迅速定位到2,然后找出和服条件记录
然后进入a=2 重复上面的过程
当查询 c = 3 的时候,先进入 a = 1,b=1,发现没有
进入 a=1,b=2,无树结构能快速定位到3(也可顺序可2分法,因为是排序好的),如此重复上面的步骤
由这个猜想
当数据量特别大并且数据可选择性很大的时候这种方式具有很大的优点
但这种猜测方式,假如 a 不具有相同值,而b 或者c 选择性比较小,那么这种结构的跳跃式扫描将是一种灾难
所以,oracle将根据统计分析结构来决定
但是,假如上述猜测不成立!
那其实,根据现象我们也能猜想出一种适合的结构来
关键在于思想上的东西
你这个想法在B树结构里很难实现。
现在就连以下条件都不能索引:
where a=1 and (b=2 or b=3)
[ 本帖最后由 yulihua49 于 2008-8-13 16:12 编辑 ] |
|