基于 Oracle 函数的索引:修改确定性函数?
Oracle Function Based Index: Modify a deterministic function?
我在我的一个表上使用自己的 DETERMINISTIC 函数作为基于函数的索引。
如果我修改这个函数的PL/SQL-Code会怎么样? (位于包中)
索引会失效吗?我是否必须(手动)重建它?
谢谢!
编辑:
这是我现在用于测试的示例脚本。
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;
是的,您必须重建索引。
在 Oracle Docs 上检查此 link,基于函数的索引的缺点部分。
索引确实存储物理数据,无论是基于函数还是其他。如果你修改底层确定性函数,你的索引不再包含有效数据,你必须手动重建它并在之后分析它。
我在我的一个表上使用自己的 DETERMINISTIC 函数作为基于函数的索引。 如果我修改这个函数的PL/SQL-Code会怎么样? (位于包中)
索引会失效吗?我是否必须(手动)重建它?
谢谢!
编辑:
这是我现在用于测试的示例脚本。
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;
是的,您必须重建索引。
在 Oracle Docs 上检查此 link,基于函数的索引的缺点部分。
索引确实存储物理数据,无论是基于函数还是其他。如果你修改底层确定性函数,你的索引不再包含有效数据,你必须手动重建它并在之后分析它。