基于函数的索引+创建基于函数的索引

来源:互联网 发布:人工智能用什么语言写 编辑:程序博客网 时间:2024/06/06 16:53

基于函数的索引
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):对该列使用的函数与基于函数的索引使用的函数一样,查询的时候就使用基于函数的索引,不全表查询.

原创粉丝点击