基于函数的索引(function-based index,FBI)

基于函数的索引(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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值