您的位置:首页 > 数据库 > Oracle

Oracle函数索引

2016-03-08 17:21 357 查看
函数索引的概念:

基于函数的索引也是8i以来的新产物,它有索引计算列的能力,它易于使用并且提供计算好的值,在不修改应用程序的逻辑上提高了查询性能。使用基于函数的索引有几个先决条件:

(1)

必须拥有QUERY REWRITE(本模式下)或GLOBAL QUERY REWRITE(其他模式下)权限。

(2)

必须使用基于成本的优化器,基于规则的优化器将被忽略。

(3)

必须设置以下两个系统参数:
QUERY_REWRITE_ENABLED=TRUE
QUERY_REWRITE_INTEGRITY=TRUSTED

可以通过alter system set,alter session set在系统级或线程级设置,也可以通过在init.ora添加实现。

这里举一个基于函数的索引的例子:

函数索引建立及数据准备:

SQL> create index test.ind_fun on test.testindex(upper(a));

索引已创建。

SQL> insert into testindex values('a',2);

已创建 1 行。

SQL> commit;

提交完成。

强制使用基于规则的优化器,所以不会使用函数索引:

SQL> select /*+ RULE*/*  FROM test.testindex where upper(a)='A';

A       B

-- ----------

a       2

Execution Plan

----------------------------------------------------------

0  SELECT STATEMENT Optimizer=HINT: RULE

1    0   TABLE ACCESS (FULL) OF 'TESTINDEX'

(优化器选择了全表扫描)

--------------------------------------------------------------------

使用函数索引:

SQL> select *  FROM test.testindex where upper(a)='A';

A       B

-- ----------

a       2

Execution Plan

----------------------------------------------------------

0  SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=5)

1    0   TABLE ACCESS (BY INDEX ROWID) OF 'TESTINDEX' (Cost=2 Card=1 Bytes=5)

2    1     INDEX (RANGE SCAN) OF 'IND_FUN' (NON-UNIQUE) (Cost=1 Card=1)

(使用了ind_fun索引)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle