如何通过Result Cache优化Oracle中频繁调用的短小函数执行效率?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1019个文字,预计阅读时间需要5分钟。
相关专题:
PL/SQL函数加了RESULT_CACHE却没生效?先看这三条硬限制
绝大多数缓存失效不是配置问题,而是撞上了 oracle 的强制校验规则。函数体里只要出现以下任一情况,缓存直接被跳过,且不报错、不警告:
- 调用了任何未声明为
DETERMINISTIC的函数(包括你自己写的 PL/SQL 函数,哪怕逻辑完全不变) - 访问了任何非只读对象:比如
SYSDATE、USER、序列NEXTVAL、临时表、自治事务中的 DML - 参数或返回值类型含
REF CURSOR、BLOB、CLOB等大对象类型(Oracle 不缓存这些)
验证是否真走缓存最简单的方法:在函数体里加一行 DBMS_OUTPUT.PUT_LINE('executed')。连续两次相同参数调用,如果第二次还打印,说明根本没进缓存路径——立刻回头检查上面三点。
查V$RESULT_CACHE_OBJECTS确认缓存状态,别只看执行计划
V$RESULT_CACHE_OBJECTS 是唯一可信的缓存登记簿。光看执行计划里有没有 RESULT CACHE 操作符没用,它只表示“尝试启用”,不代表缓存已建立或命中。
本文共计1019个文字,预计阅读时间需要5分钟。
相关专题:
PL/SQL函数加了RESULT_CACHE却没生效?先看这三条硬限制
绝大多数缓存失效不是配置问题,而是撞上了 oracle 的强制校验规则。函数体里只要出现以下任一情况,缓存直接被跳过,且不报错、不警告:
- 调用了任何未声明为
DETERMINISTIC的函数(包括你自己写的 PL/SQL 函数,哪怕逻辑完全不变) - 访问了任何非只读对象:比如
SYSDATE、USER、序列NEXTVAL、临时表、自治事务中的 DML - 参数或返回值类型含
REF CURSOR、BLOB、CLOB等大对象类型(Oracle 不缓存这些)
验证是否真走缓存最简单的方法:在函数体里加一行 DBMS_OUTPUT.PUT_LINE('executed')。连续两次相同参数调用,如果第二次还打印,说明根本没进缓存路径——立刻回头检查上面三点。
查V$RESULT_CACHE_OBJECTS确认缓存状态,别只看执行计划
V$RESULT_CACHE_OBJECTS 是唯一可信的缓存登记簿。光看执行计划里有没有 RESULT CACHE 操作符没用,它只表示“尝试启用”,不代表缓存已建立或命中。

