【问题标题】:Oracle Function Based Index: Modify a deterministic function?Oracle 基于函数的索引:修改确定性函数?
【发布时间】:2015-05-29 06:39:35
【问题描述】:

我正在为我的一张表上的基于函数的索引使用自己的 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 indexing plsql deterministic


    【解决方案1】:

    是的,你必须重建索引。

    查看Oracle Docs 上的此链接,基于函数的索引的缺点部分。

    索引确实存储物理数据,无论是基于函数的还是其他的。如果你修改了底层的确定性函数,你的索引不再包含有效数据,你必须手动重建它并在之后进行分析。

    【讨论】:

    • 感谢链接,同时,我写了一个测试脚本,显示这个问题。
    猜你喜欢
    • 1970-01-01
    • 2017-06-23
    • 2011-10-05
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 2013-09-26
    相关资源
    最近更新 更多