Oracle Function Based Index:修改确定性函数?

时间:2015-05-29 06:39:36

标签: oracle indexing plsql deterministic

我在我的一个表上使用自己的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_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;

1 个答案:

答案 0 :(得分:2)

是的,您必须重建索引。

检查Oracle Docs上的此链接,基于功能的索引的缺点部分。

索引存储物理数据,无论是基于功能还是其他方式。如果修改基础确定性函数,则索引不再包含有效数据,您必须手动重建它并在之后进行分析。