ORACLE 10g允许建立函数索引,默认情况下只能使用系统函数。如果要建立基于用户自定义函数的索引。那么就需要在函数里加上关键字“deterministic”。但是用户仍然可以在今后需要时修改函数。 但是并不会造成索引失效。经试验发现了一个有趣的现象,总结如下:
[@more@]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, 使用自定义函数索引,在维护时需要小心。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/350519/viewspace-1033621/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/350519/viewspace-1033621/