转自: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