基于Oracle函数的索引:修改确定性函数?
我正在使用一个自己的确定性函数作为基于一个表的函数索引。 如果修改此函数的PL/SQL代码,会发生什么?(位于包装中) 索引会失效吗?我必须(手动)重建它吗 谢谢 编辑: 下面是我的示例脚本,我现在使用它进行测试基于Oracle函数的索引:修改确定性函数?,oracle,indexing,plsql,deterministic,Oracle,Indexing,Plsql,Deterministic,我正在使用一个自己的确定性函数作为基于一个表的函数索引。 如果修改此函数的PL/SQL代码,会发生什么?(位于包装中) 索引会失效吗?我必须(手动)重建它吗 谢谢 编辑: 下面是我的示例脚本,我现在使用它进行测试 CREATE OR REPLACE FUNCTION func_test(v IN NUMBER) RETURN VARCHAR deterministic IS BEGIN RETURN 'lol' || To_Char(v); END; / CREATE TABLE tab_te
CREATE OR REPLACE FUNCTION func_test(v IN NUMBER) RETURN VARCHAR deterministic IS
BEGIN RETURN 'lol' || To_Char(v); END;
/
CREATE TABLE tab_test (id NUMBER(20,0) NOT NULL);
INSERT INTO tab_test VALUES (1);
INSERT INTO tab_test VALUES (2);
INSERT INTO tab_test VALUES (3);
CREATE INDEX idx_test ON tab_test (func_test(id));
SELECT id, func_test(id) FROM tab_test WHERE func_test(id) = func_test(2);
--1 first records fetched in 0 ms
--
--| 2 | lol2 |
--Change Function
CREATE OR REPLACE FUNCTION func_test(v IN NUMBER) RETURN VARCHAR deterministic IS
BEGIN RETURN 'rofl' || To_Char(v); END;
/
SELECT id, func_test(id) FROM tab_test WHERE func_test(id) = func_test(2);
-- 0 first records fetched in 0 ms
ALTER INDEX idx_test rebuild;
SELECT id, func_test(id) FROM tab_test WHERE func_test(id) = func_test(2);
--1 first records fetched in 0 ms
--
--| 2 | rofl2 |
DROP TABLE tab_test;
DROP FUNCTION func_test;
是的,您必须重建索引 在“基于函数的索引的缺点”一节中检查此链接
索引确实存储物理数据,无论是基于函数还是其他。如果修改基础的确定性函数,索引将不再包含有效数据,您必须手动重新生成并在以后进行分析。感谢您提供的链接,同时,我编写了一个测试脚本,说明了这个问题。