确定性函数何时使用先前计算的值?

 mobiledu2502881303 发布于 2023-01-30 20:13

考虑一个确定性函数,如:

CREATE OR REPLACE FUNCTION SCHEMA.GET_NAME(ss_id nvarchar2
                     ) RETURN nvarchar2 DETERMINISTIC IS
    tmpVar nvarchar2(500);
    BEGIN

        select name into tmpvar from logistics.organization_items 
         where id = ss_id ;
        return tmpvar ;  

    END ss_name;

使用Toad我打电话给SCHEMA.GET_NAME(1)它然后它返回A.然后我将表中的值更改AB并调用SCHEMA.GET_NAME(1)返回的值B.

这是一个很好的结果.但是我害怕根据文档中的这个页面没有更新的值,它说:

当Oracle数据库在其中一个上下文中遇到确定性函数时,它会尝试在可能的情况下使用先前计算的结果,而不是重新执行该函数.如果随后更改了函数的语义,则必须手动重建所有依赖于函数的索引和物化视图.

在什么情况下GET_NAME(1)返回一个旧的缓存值(A而不是B)?

1 个回答
  • 如果从表中选择,则函数的结果不是确定性的.甲确定性系统是一个将总是产生相同的输出,给定相同的初始条件.

    可以更改表中的信息,因此从表中选择的函数不是确定性的.引用PL/SQL语言参考:

    不要指定此子句来定义使用包变量的函数,或以任何可能影响函数返回结果的方式访问数据库的函数.如果数据库选择不重新执行该功能,则不会捕获这样做的结果.

    换句话说,Oracle并不保证函数的结果是准确的(它们可能就是这样).如果你的表是静态的,并且不太可能改变,那么它应该没问题,但这不是我想要依赖的东西.要回答您的问题,请不要假设Oracle将在同一事务/会话中返回除缓存值之外的任何内容.

    如果你需要加快速度,有两种方法.首先,检查你有索引ID!

      只需加入此表.如果你的功能只是这个,那么就不需要存在这个功能.

      使用标量子查询缓存(不一定可能,但值得尝试).

      select ( select get_name(:id) from dual )
         from your_table
      

      Oracle将创建函数结果的内存中散列,如结果缓存.如果您多次执行相同的功能,那么Oracle将访问缓存而不是功能.

    2023-01-30 20:16 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有