建立函式索引須知DETERMINISTIC
比如我們先寫一個自定義的函式,此函式是將16進位制轉換為10進位制
SQL> CREATE OR REPLACE FUNCTION hex2ten
2 (
3 p_str IN VARCHAR2,
4 p_from_base IN NUMBER DEFAULT 16
5 ) RETURN NUMBER
6 IS
7 l_num NUMBER DEFAULT 0;
8 l_hex VARCHAR2 (16) DEFAULT '0123456789ABCDEF';
9 BEGIN
10 FOR i IN 1 .. LENGTH (p_str)
11 LOOP
12 l_num := l_num * p_from_base + INSTR (l_hex, UPPER (SUBSTR (p_str, i, 1))) - 1;
13 END LOOP;
14
15 RETURN l_num;
16 END hex2ten;
17 /
函式已建立。
我們建一個表做個測試
SQL> create table alan
2 as
3 select username, 'b' HEX from dba_users;
表已建立。
之後為這個表建立一個基於自定義的函式索引
SQL> create index alan_ind_fun on alan(hex2ten(HEX));
create index alan_ind_fun on alan(hex2ten(HEX))
*
ERROR 位於第 1 行:
ORA-30553: 函式不能確定
這是為什麼呢?
這是因為我們在建立函式的時候沒有加一個hint,oracle是這樣解釋的:
The hint DETERMINISTIC helps the optimizer avoid redundant function calls. If a stored function was called previously with the same arguments, the optimizer can elect to use the previous result. The function result should not depend on the state of session variables or schema objects. Otherwise, results might vary across calls. Only DETERMINISTIC functions can be called from a function-based index or a materialized view that has query-rewrite enabled.
因此在建立function的時候我們可以加一個hint
SQL> drop function hex2ten
2 ;
函式已丟棄。
SQL> CREATE OR REPLACE FUNCTION hex2ten
2 (
3 p_str IN VARCHAR2,
4 p_from_base IN NUMBER DEFAULT 16
5 ) RETURN NUMBER DETERMINISTIC
6 IS
7 l_num NUMBER DEFAULT 0;
8 l_hex VARCHAR2 (16) DEFAULT '0123456789ABCDEF';
9 BEGIN
10 FOR i IN 1 .. LENGTH (p_str)
11 LOOP
12 l_num := l_num * p_from_base + INSTR (l_hex, UPPER (SUBSTR (p_str, i, 1))) - 1;
13 END LOOP;
14
15 RETURN l_num;
16 END hex2ten;
17 /
函式已建立。
這樣就可以成功的建立索引了。
SQL> create index alan_ind_fun on alan(hex2ten(HEX));
索引已建立。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12361284/viewspace-1291/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- deterministic function 函式索引Function函式索引
- 函式DETERMINISTIC函式
- ORACLE FUNCTION函式中DETERMINISTIC測試OracleFunction函式
- 0427建立Extended Statistics函式索引問題函式索引
- 0429建立Extended Statistics函式索引問題函式索引
- 測試建立基於函式的索引函式索引
- [Q]怎樣建立基於函式索引zt函式索引
- 關於索引必須知道的知識索引
- 函式索引陷阱函式索引
- oracle函式索引Oracle函式索引
- 函式索引使用細節——自定義函式的索引化函式索引
- 如何使用CSS建立高階動畫,這個函式必須掌握CSS動畫函式
- 建立函式函式
- 建立聯合函式索引解決top sql效能問題函式索引SQL
- Oracle之函式索引Oracle函式索引
- 說說函式索引函式索引
- 索引中使用函式索引函式
- 建立Data guard logical standby database須知Database
- 基於函式的索引函式索引
- 函式索引的問題函式索引
- 函式索引的儲存函式索引
- SQL優化--函式索引SQL優化函式索引
- sequence 和索引函式呼叫索引函式
- 建立函式失敗函式
- Oracle索引梳理系列(六)- Oracle索引種類之函式索引Oracle索引函式
- 使用自定義函式創Function-Based Indexes時需要使用DETERMINISTIC Functions!函式FunctionIndex
- MySQL函式索引及優化MySql函式索引優化
- Oracle基於函式的索引Oracle函式索引
- 索引ROWID轉換函式索引函式
- 關於資料庫索引,必須掌握的知識點資料庫索引
- 建立索引,這些知識應該瞭解索引
- 【知識點】inline函式、回撥函式、普通函式inline函式
- 建構函式建立物件函式物件
- shell高階-----建立函式函式
- MySQL建立自定義函式MySql函式
- 複合索引與函式索引優化一例索引函式優化
- OCP之基於函式的索引函式索引
- 關於函式索引的問題?函式索引