日期:2014-05-16  浏览次数:20407 次

基于函数的索引

转自:http://blog.sina.com.cn/s/blog_3f2ef1180100mi3y.html

?

使用基于函数的索引(BFI, Based Function Index):

Oracle 8i开始,可以使用基于函数的索引来提高查询性能,

?

使用基于函数的索引,需要几个条件:

1, 用户需要有create index或者create any index权限

2, 用户需要有query rewrite或者global query rewirte权限

3, 设置系统参数 query_rewrite_enabled=TRUE

query_rewrite_integrity=enforced

4, 设置系统参数 :COMPATIBLE=8.1.0.0.0 或者更高

5,创建了BFI后,需要对表进行分析

?

请看下面的例子:

首先,在没有建立函数索引的情况下,我们看到查询没有如我们想想一样使用单列(dname)索引:

SQL> set autotrace traceonly

SQL> select * from dept where substr(dname,1,5)='aaa';

?

未选定行

?

已用时间: 00: 00: 00.00

?

Execution Plan

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

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (FULL) OF 'DEPT'

?

?

?

?

Statistics

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

134 recursive calls

0 db block gets

20 consistent gets

0 physical reads

0 redo size

323 bytes sent via SQL*Net to client

372 bytes received via SQL*Net from client

1 SQL*Net roundtrips to/from client

2 sorts (memory)

0 sorts (disk)

0 rows processed