您的位置:首页 > 数据库 > Oracle

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技术论坛
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: