基于函数的索引
1基于函数的索引是常规的B树索引。
2该索引存放的数据是由表中的数据应用函数后得到的,而不是直接存放表中的数据本身。
3如果查询条件包含与索引相同的函数,就可以使用基于函数的索引,提高查询速度
举例

测试表
 create  table student2(
sno varchar2(10) primary key,
sname varchar2(20),
sage number(2),
cno  varchar2(2)
);

insert into zhou.student2 values('1','LILIA',18,'1');
insert into zhou.student2 values('2','LILIB',18,'1');


这个时候select sname  from student2 where sname='lilia';
是查不来数据的,要想忽略大小写,那么可以这样写
select sname  from student2 where upper(sname)=upper('lilia');
但是这个会引发一个问题?
这样实现的话,某一列的普通B树索引还有用吗?没有用
用户使用这种查询方式,用户不是基于表中的存储记录进行搜索的,即使在某一列上建立了索引,但是oracle会被破执行全表搜索,为遇到的每一行都计算upper()函数。
如果解决?使用基于函数的索引

创建基于函数的索引
1可以提高在查询条件中使用函数和表达式时查找的执行速度
2如果用户在自己模式中创建基于函数的索引,那么必须具有query rewrite系统权限;
如果用户想要在其他模式中创建基于函数的索引,需要create any index和global query rewrite权限
3创建基于函数的索引时,oracle会首先对包含索引列的函数值或者表达式值进行求值,然后对求职后的结果进行排序,最后存储到索引中。

举例

create index sname_index on zhou.student2(upper(sname))
tablespace MYSPACE;
这里写图片描述

查询条件包含与索引相同的函数
select sname from zhou.student2 where upper(sname)=upper(‘lilia’);
这里写图片描述

select ….upper(sname):对该列使用的函数与基于函数的索引使用的函数一样,查询的时候就使用基于函数的索引,不全表查询.

posted on 2017-05-28 15:57  2637282556  阅读(254)  评论(0编辑  收藏  举报