函式索引陷阱
點選(此處)摺疊或開啟
-
--自定義函式使用函式索引要注意函式程式碼改變後的影響。
-
DROP TABLE t;
-
CREATE TABLE t ( x NUMBER, y VARCHAR2(30));
-
-
INSERT INTO t SELECT ROWNUM, ROWNUM || \'a\' FROM dual CONNECT BY ROWNUM < 1000;
-
-
CREATE OR REPLACE PACKAGE pkg_f
-
IS
-
FUNCTION f(p_value VARCHAR2) RETURN VARCHAR2 DETERMINISTIC;
-
END;
-
/
-
-
create or REPLACE package body pkg_f
-
is
-
function f(p_value varchar2) return VARCHAR2 deterministic is
-
begin
-
return p_value;
-
end;
-
end;
-
/
-
-
create index idx_pkg_f_y on t ( pkg_f.f(y));
-
analyze table t compute statistics for table for all indexes for all indexed columns;
-
set autotrace on explain
-
SELECT * FROM t WHERE pkg_f.f(y)= \'8a\';
-
-
X Y
-
---------- ------------------------------
- 8 8a
點選(此處)摺疊或開啟
-
--修改包的定義
-
create or REPLACE package body pkg_f
-
is
-
function f(p_value varchar2) return VARCHAR2 deterministic
-
is
-
begin
-
return p_value||\'b\';
-
end;
-
end;
-
/
-
-
--驚奇地發現查詢出錯誤的值:
-
SELECT * FROM t WHERE pkg_f.f(y)= \'8a\';
-
-
X Y
-
---------- ------------------------------
- 8 8a
點選(此處)摺疊或開啟
-
--重建索引,再次查詢,得到正確的結果
-
drop index idx_pkg_f_y;
-
create index idx_pkg_f_y on t ( pkg_f.f(y));
-
SELECT * FROM t WHERE pkg_f.f(y)= \'8a\';
-
-
luise@TESTDB11>SELECT * FROM t WHERE pkg_f.f(y)= \'8a\';
-
- no rows selected
--這裡使用的是包中定義的函式,獨立函式也是如此。
--結論:使用函式索引一定要注意在函式程式碼修改後,一定要重建函式索引.
-- 否則Oracle就會使用原來的函式索引查詢出錯誤的結果,而沒有任何提示來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-1071280/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 箭頭函式this指向的陷阱函式
- oracle函式索引Oracle函式索引
- 函式索引使用細節——自定義函式的索引化函式索引
- python的socket.recv函式陷阱Python函式
- 拷貝建構函式中的陷阱函式
- Oracle之函式索引Oracle函式索引
- 說說函式索引函式索引
- 索引中使用函式索引函式
- PostgreSQL RDS索引陷阱 - nanitSQL索引NaN
- 基於函式的索引函式索引
- 函式索引的問題函式索引
- deterministic function 函式索引Function函式索引
- 函式索引的儲存函式索引
- SQL優化--函式索引SQL優化函式索引
- sequence 和索引函式呼叫索引函式
- MySQL 之 ROUND 函式四捨五入的陷阱MySql函式
- Oracle索引梳理系列(六)- Oracle索引種類之函式索引Oracle索引函式
- MySQL函式索引及優化MySql函式索引優化
- Oracle基於函式的索引Oracle函式索引
- 索引ROWID轉換函式索引函式
- 複合索引與函式索引優化一例索引函式優化
- OCP之基於函式的索引函式索引
- 關於函式索引的問題?函式索引
- 函式索引產生隱藏列函式索引
- 建立函式索引須知DETERMINISTIC函式索引
- 函式索引的使用細節——常數表示式函式索引
- mysql 拾遺提高(函式、事務、索引)MySql函式索引
- 0427建立Extended Statistics函式索引問題函式索引
- 0429建立Extended Statistics函式索引問題函式索引
- 自定義函式索引使用及其注意點函式索引
- 測試建立基於函式的索引函式索引
- 關於函式索引(function-based index)函式索引FunctionIndex
- cursor_sharing和substr函式索引函式索引
- [20120612]函式索引中使用substr函式.txt函式索引
- Python函式引數預設值的陷阱和原理深究Python函式
- Golang 切片作為函式引數傳遞的陷阱與解答Golang函式
- 用函式索引構造特殊的約束函式索引
- 資料型別與函式索引-PostgreSQL篇資料型別函式索引SQL