ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 基于函数的索引

基于函数的索引

原创 Linux操作系统 作者:279531451 时间:2009-10-26 21:13:21 0 删除 编辑

 基于函数的索引
   create index T_IDX_UPPER on t (upper(object_name));
   SQL> select object_name from t where upper(object_name)='_DEFSCHEDULE'  order by upper(object_name);

OBJECT_NAME
------------------------------
_DEFSCHEDULE


执行计划
----------------------------------------------------------
Plan hash value: 19661266

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

| Id  | Operation      | Name   | Rows  | Bytes | Cost (%CPU)|
 Time   |

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

|   0 | SELECT STATEMENT     |    |   703 | 23902 |   151   (0)|
 00:00:02 |

|   1 |  TABLE ACCESS BY INDEX ROWID| T    |   703 | 23902 |   151   (0)|
 00:00:02 |

|*  2 |   INDEX RANGE SCAN     | T_IDX_UPPER |   281 |   | 3   (0)|
 00:00:01 |

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


Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access(UPPER("OBJECT_NAME")='_DEFSCHEDULE')

Note
-----
   - dynamic sampling used for this statement (level=2)


统计信息
----------------------------------------------------------
   4  recursive calls
   0  db block gets
  71  consistent gets
   4  physical reads
   0  redo size
 436  bytes sent via SQL*Net to client
 415  bytes received via SQL*Net from client
   2  SQL*Net roundtrips to/from client
   0  sorts (memory)
   0  sorts (disk)
   1  rows processed

看到上述测试,基于函数的索引被使用、注意一点。使用基于函数的索引确保函数返回的值不能是NULL。
下面演示:
update tt set object_name = null where object_id (select object_id from tt where rownum <100)

SQL> select object_id,object_name from tt where upper(object_name)='LOGMNRG_CDEF$';

 OBJECT_ID OBJECT_NAME
---------- ------------------------------
      1117 LOGMNRG_CDEF$


执行计划
----------------------------------------------------------
Plan hash value: 264906180

--------------------------------------------------------------------------
| Id  | Operation   | Name | Rows  | Bytes | Cost (%CPU)| Time  |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |  |     1 |    30 |     5   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| TT  |     1 |    30 |     5   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(UPPER("OBJECT_NAME")='LOGMNRG_CDEF$')

Note
-----
   - dynamic sampling used for this statement (level=2)

显然没有用到索引
在列上不为空的时候
SQL> select object_id,object_name from t10 where upper(object_name)='LOGMNRG_CDEF$';

 OBJECT_ID OBJECT_NAME
---------- ------------------------------
      1117 LOGMNRG_CDEF$


执行计划
----------------------------------------------------------
Plan hash value: 281665498

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

| Id  | Operation      | Name     | Rows  | Bytes | Cost (%CPU)| Ti
me     |

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

|   0 | SELECT STATEMENT     |        |    10 |   470 |     2  (0)| 00
:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| T10      |    10 |   470 |     2  (0)| 00
:00:01 |

|*  2 |   INDEX RANGE SCAN     | T_IDX_10 |     4 |       |     1  (0)| 00
:00:01 |

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


Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access(UPPER("OBJECT_NAME")='LOGMNRG_CDEF$')

Note
-----
   - dynamic sampling used for this statement (level=2)
索引使用了!!
所以,使用基于函数的索引列一定不能为空,否则,索引无效

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7551038/viewspace-617541/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 索引压缩(三)
请登录后发表评论 登录
全部评论

注册时间:2009-09-01

  • 博文量
    100
  • 访问量
    182885