INDEX fast full scan 和 index range scan 根本就是不同的概念,你需要先把原理弄清楚再来看表象
index range scan 是 根据叶子节点的顺序去寻找数据,数据出来和索引顺序是一致的排好顺序的,一次读一个索引block和一个数据block
index fast full scan 是根据索引 segment 的 extent 去搜索的,这个跟 FTS 的原理类似,不过 table segment 换成了 index segment ,一次读可以是连续的多个 index block ,这样出来的数据顺序和 索引顺序并不一致。
而我们通常说的利用不上索引 指的 是 index range scan or other index scan ,不是 index fast full scan 。
index fast full scan 的前提是,数据肯定在索引中有(比如not null 的字段,或者复合索引,bitmap索引等),然后 索引 segment比表 segment小,通过索引segment 能得到所需要数据,而不用去读 任何表的block,这样 IO 将减少。
select count(*) from .... where object_name like '%xxxxx%';
select count(*) from .... where object_name like 'xxxxx%';
可楼主确实是这样问过的,range index与fast full index scan谁快?
假如返回的结果是相同的,
一个是fast full index scan,一个是index range,由于可以执行fast full index scan,那在index range 中,这个SQL也可以不用访问表而可以直接得到结果,没有跑题吧。
select count(*) from .... where object_name like '%xxxxx%';
select count(*) from .... where object_name like 'xxxxx%';
可楼主确实是这样问过的,range index与fast full index scan谁快?
假如返回的结果是相同的,
一个是fast full index scan,一个是index range,由于可以执行fast full index scan,那在index range 中,这个SQL也可以不用访问表而可以直接得到结果,没有跑题吧。
[/B]
两个 like 的差异明显这么大,这种问发,是因为问问题的人不明白,你拿他的 特定情况 下一个 扩大化的的结论
在非常有限条件下成立的东西,放到其他条件下就是错误的结论