ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 基于函数的索引(function-based index,FBI)

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

原创 Linux操作系统 作者:pingley 时间:2012-04-08 23:17:27 0 删除 编辑
基于函数的索引(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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    169
  • 访问量
    717647