oracle自定义函数创建函数索引
2014-03-27 13:37
393 查看
ORACLE 10g允许建立函数索引,默认情况下只能使用系统函数。如果要建立基于用户自定义函数的索引。那么就需要在函数里加上关键字“deterministic”。但是用户仍然可以在今后需要时修改函数。 但是并不会造成索引失效。经试验发现了一个有趣的现象,总结如下:
create function f1 ( return c*2+1) ;
create index id_t1_c1 on t1(f1(c)) ;
replace function f1 ( return c*2) ;
SQL> SELECT F1(5) FROM DUAL ;
F1(5)
----------
10
SQL> SELECT * FROM T1 WHERE F1(C1) = 101 ;
C1
----------
50
SQL> SELECT C1, F1(C1) FROM T1 WHERE F1(C1) BETWEEN 101 AND 120;
C1 F1(C1)
---------- ---------------------------------------
50 101
51 103
52 105
53 107
54 109
55 111
56 113
57 115
58 117
59 119
10 rows selected
SQL> ALTER INDEX ID_T1_C1 REBUILD ;
Index altered
SQL> SELECT C1, F1(C1) FROM T1 WHERE F1(C1) BETWEEN 101 AND 120;
C1 F1(C1)
---------- ---------------------------------------
51 102
52 104
53 106
54 108
55 110
56 112
57 114
58 116
59 118
60 120
10 rows selected
总结:
1,索引修改后,立即生效,
2, 但是SELECT 的表上相关字段如果建立了函数索引,且索引未重建,那么,对于该列计算出的值仍是旧函数值。-----其实ORACLE根本就没有计算,而是走索引得出来的。
3,重建索引后,计算数值恢复正确值 。
4, 使用自定义函数索引,在维护时需要小心。
原文转自:http://www.itpub.net/thread-1303236-1-1.html ITPUB技术论坛
create function f1 ( return c*2+1) ;
create index id_t1_c1 on t1(f1(c)) ;
replace function f1 ( return c*2) ;
SQL> SELECT F1(5) FROM DUAL ;
F1(5)
----------
10
SQL> SELECT * FROM T1 WHERE F1(C1) = 101 ;
C1
----------
50
SQL> SELECT C1, F1(C1) FROM T1 WHERE F1(C1) BETWEEN 101 AND 120;
C1 F1(C1)
---------- ---------------------------------------
50 101
51 103
52 105
53 107
54 109
55 111
56 113
57 115
58 117
59 119
10 rows selected
SQL> ALTER INDEX ID_T1_C1 REBUILD ;
Index altered
SQL> SELECT C1, F1(C1) FROM T1 WHERE F1(C1) BETWEEN 101 AND 120;
C1 F1(C1)
---------- ---------------------------------------
51 102
52 104
53 106
54 108
55 110
56 112
57 114
58 116
59 118
60 120
10 rows selected
总结:
1,索引修改后,立即生效,
2, 但是SELECT 的表上相关字段如果建立了函数索引,且索引未重建,那么,对于该列计算出的值仍是旧函数值。-----其实ORACLE根本就没有计算,而是走索引得出来的。
3,重建索引后,计算数值恢复正确值 。
4, 使用自定义函数索引,在维护时需要小心。
原文转自:http://www.itpub.net/thread-1303236-1-1.html ITPUB技术论坛
相关文章推荐
- Oracle技术之基于自定义函数的Function-Based索引创建
- 基于自定义函数的Function-Based索引创建
- Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句?
- oracle 创建表,序列,索引,视图,触发器,函数,存储过程,定时器,包体
- oracle自定义函数索引陷阱
- 基于自定义函数的Function-Based索引创建
- oracle创建函数索引
- 如何创建oracle函数索引
- 基于自定义函数的Function-Based索引创建
- oracle---给表创建函数索引
- Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句?
- oracle创建索引
- oracle创建索引
- oracle函数索引小结
- Oracle笔记 五、创建表、约束、视图、索引、序列、同义词、表空间
- Oracle创建分割函数,及用法
- oracle常用自定义函数集合
- 自定义Oracle 函数,传入参数,实现简单的功能
- oracle 自定义列转行函数
- Oracle查找没有创建索引的外键