關於函式索引(function-based index)
函式索引是從8i開始提供的,有了函式索引就可以在索引中使用函式或者表示式了。
例:
SQL> create table sunwg (id varchar2(10));
Table created.
[@more@]SQL> insert into sunwg values('a');
1 row created.
SQL> commit;
Commit complete.
SQL>create index ind_sunwg on sunwg(id);
SQL>select * from sunwg where upper(id) = ‘TOM’;
這樣的情況下,這個SQL是不會走索引的,因為在ID上面存在函式UPPER,所以只能走全表掃描。
但是利用函式索引,上面的SQL也是可以走索引的。
SQL>drop index ind_sunwg;
SQL>create index ind_sunwg on sunwg(upper(id));
SQL>analyze table sunwg compute statistics for table for all indexes for all indexed columns;
開啟AUTOTRACE重新執行上面的SQL,可以發現已經可以走索引了。
上面的函式是系統自帶的,那麼使用自己定義的函式呢?
SQL>create or replace function md5(n varchar2)
2 return varchar2
3 as
4 n_string varchar2(100) default null;
5 begin
6 dbms_obfuscation_toolkit.md5(INPUT_STRING => n,CHECKSUM_STRING => n_string);
7 return RAWTOHEX(UTL_RAW.CAST_TO_raw(n_string));
8 end;
/
SQL>drop index ind_sunwg;
SQL> create index ind_sunwg on sunwg(md5(id));
create index ind_sunwg on sunwg(md5(id))
*
ERROR at line 1:
ORA-30553: The function is not deterministic
可以看出來用自己定義的函式來建函式索引會報一個ORA-30553的錯誤。錯誤的原因是因為函式沒有宣告確定性,修改函式增加確定性標識deterministic。
SQL>create or replace function md5(n varchar2)
2 return varchar2 deterministic
3 as
4 n_string varchar2(100) default null;
5 begin
6 dbms_obfuscation_toolkit.md5(INPUT_STRING => n,CHECKSUM_STRING => n_string);
7 return RAWTOHEX(UTL_RAW.CAST_TO_raw(n_string));
8 end;
/
SQL> create index ind_sunwg on sunwg(md5(id));
Index created.
增加確定性標識後就沒有上面的問題了。
下面這些是網友總結的關於函式索引的限制和規則對於下面這些限制,不能建立FBI索引:
a) LOB 列
b) REF
c) Nested table 列
d) 包含上面資料型別的物件
FBI索引必須遵守下面的規則:
a) 必須使用基於成本的最佳化器,而且建立後必須對索引進行分析
b) 不能儲存NULL值。因為任何函式在任何情況下都不能返回NULL值。
c)如果一個使用者定義的PL/SQL例程失效了,而且這個例程被FBI索引用到了,那麼相應的這個FBI索引會變成DISABLED
d)建立FBI索引得函式必須是確定性的。即,對於指定的輸入,總是會返回確定的結果。
e) 索引的屬主如果沒有了在FBI索引裡面使用的函式的執行許可權,那麼這個FBI索引會變成DISABLED.
f) 在建立索引得函式里面不能使用SUM等總計函式。
g)要把一個DISABLED了的索引重新變成ENABLED,這個函式必須首先是ENABLED的才可以。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8394333/viewspace-996327/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於函式的索引(function-based index,FBI)函式索引FunctionIndex
- 關於函式索引的問題?函式索引
- Function-based Index and Or-ExpansionFunctionIndex
- 基於函式的索引函式索引
- query rewrite和基於函式的索引有關係?函式索引
- Oracle基於函式的索引Oracle函式索引
- OCP之基於函式的索引函式索引
- 測試建立基於函式的索引函式索引
- [20190918]關於函式索引問題.txt函式索引
- [20171202]關於函式索引的狀態.txt函式索引
- reverse index 反轉索引相關Index索引
- oracle index索引相關筆記OracleIndex索引筆記
- 關於B*tree索引(index)的中度理解及bitmap 索引的一點探究(zt)索引Index
- 關於函式指標函式指標
- 關於Oracle 9i 跳躍式索引掃描(Index Skip Scan)的小測試 (轉)Oracle索引Index
- 基於函式的索引狀態變化函式索引
- [Q]怎樣建立基於函式索引zt函式索引
- 函式索引陷阱函式索引
- oracle函式索引Oracle函式索引
- 基於函式index的一點簡單測試!函式Index
- index索引Index索引
- 函式索引使用細節——自定義函式的索引化函式索引
- 關於count函式的理解函式
- 關於path_alloc()函式函式
- 關於inline函式inline函式
- 關於lag函式的用法函式
- 高效的SQL(Function-based Indexes 函式、運算優化思路)SQLFunctionIndex函式優化
- 關於Hash 函式 雜湊索引表 解決位置衝突的問題函式索引
- 關於INDEX SKIP SCANIndex
- MySQL 函式索引功能終於可以實現了MySql函式索引
- Oracle 19c中基於函式的索引Oracle函式索引
- 2 Day DBA-管理方案物件-關於方案物件管理許可權-管理索引-列和函式索引物件索引函式
- Oracle之函式索引Oracle函式索引
- 說說函式索引函式索引
- 索引中使用函式索引函式
- 關於建構函式與解構函式的分享函式
- mysql 函式substring_index()MySql函式Index
- python關於函式形參Python函式