基于函数的索引(function-based index,FBI)
FBI 是非常有用的索引,如果查询条件基于与FBI相同的函数或者表达式。当查询条件找到了
可用的合适的FBI以后,会忽略使用这些columns 上的非FBI索引。FBI索引既可以是b-tree
类型的也可以是bitmap 类型的。FBI可以用来处理null 值,大小写敏感查找等问题。
注:以下都使用FBI 代表基于函数的索引,这样可以让我少敲几个字。
为了让优化器能够使用FBI,在系统会在会话级别必须设置如下的两个参数。
SQL> show parameter query_rewrite_enabled
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
query_rewrite_enabled string TRUE
SQL> show parameter query_rewrite_integrity
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
query_rewrite_integrity string TRUSTED
当在查询条件中对索引列使用函数或者表达式,oracle数据库将不会使用该列的索引
而是进行全表扫描。在查询条件中对索引列使用函数或者表达式。
SQL> explain plan for
2 select employee_id,first_name,last_name
3 from employees
4 where employee_id+3=200;
Explained.
SQL> select * from table (dbms_xplan.display(null,null,'basic'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1445457117
---------------------------------------
| Id | Operation | Name |
---------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS FULL| EMPLOYEES |
---------------------------------------
8 rows selected.
执行该语句的时候不会使用employee_id 上的唯一索引。下面是不使用函数或者表达式的例子。
SQL> explain plan for
2 select employee_id,first_name,last_name
3 from employees
4 where employee_id = 197;
Explained.
SQL> select * from table (dbms_xplan.display(null,null,'basic'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1833546154
-----------------------------------------------------
| Id | Operation | Name |
-----------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES |
| 2 | INDEX UNIQUE SCAN | EMP_EMP_ID_PK |
-----------------------------------------------------
9 rows selected.
没有使用函数或者表达式的语句中,oracle 会使用employee_id 列上的索引。
为了在查找条件中对列运用了函数或者表达式的时候,任然可以使用该列上的索引
可以创建FBI.
先把departments 表中的department_name 转换成小写。
update departments
set department_name = lower(department_name);
在department_name 列上创建一个FBI。
SQL> create index depart_name_idx
2 on departments(upper(department_name));
Index created.
在查询条件中使用函数。
SQL> select department_id,department_name,location_id
2 from departments
3 where upper(department_name) = 'FINANCE';
DEPARTMENT_ID DEPARTMENT_NAME LOCATION_ID
------------- ------------------------------ -----------
100 finance 1700
SQL> select * from table (dbms_xplan.display(null,null,'basic'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3620482735
-------------------------------------------------------
| Id | Operation | Name |
-------------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS BY INDEX ROWID| DEPARTMENTS |
| 2 | INDEX RANGE SCAN | DEPART_NAME_IDX |
-------------------------------------------------------
9 rows selected.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26110315/viewspace-720675/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26110315/viewspace-720675/