基于函数的索引
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/ ,如需转载,请注明出处,否则将追究法律责任。