deterministic function 函式索引

itpremier發表於2010-05-15

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章