oralce索引中INDEX SKIP SCAN 和 INDEX RANGE SCAN区别

INDEX SKIP SCAN

当表中建立有复合索引的时候,查询时,除复合索引第一列外,别的列作为条件时,且优化器模式为CBO,这个时候查询可能会用到INDEX SKIP SCAN

skip scan会检测出前导列的唯一值个数,每个唯一值都会作为常规扫描的入口,再次基础上做一次查找,最后将这些查询的结果合并返回;

举个例子:加入有这么一张表student(字段id,sex,name等)创建了一个复合索引(sex,name);

select id,sex,name where name = '张四'

上面这个查询条件name在复合索引中,且不是第一列,那么会将第一列sex,作为入口,sex列在数据库中无非两个值:男或女,那么它将转换为

select id,sex,name where sex = '' and name = '张四'
union
select id,sex,name where sex = '' and name = '张四'

也就是说sex有几个值,他就会有几个查询,并将这几个查询结果合并

如果入口的数据集较大时,那么这个查询效率是很低的。但是相比全表扫描来说也是很快的,相比直接索引来说效率是低下的

INDEX RANGE SCAN

range scan是一种常用的检索方式,在index range scan中oracle访问毗邻的索引条目,然后根据rowid去检索表里的条目,

例如查询:查询范围为80号的部门里的所有员工

select JOB_ID,FIRST_NAME from employees where DEPARTMENT_ID=80;

INDEX RANGE SCAN是范围扫描,举个例子,有1到100,分5个范围,要查询45就要到第3的范围里查,这样会很快

 

posted @ 2019-12-02 15:41  天中之云  阅读(2202)  评论(0编辑  收藏  举报