Oracle 内存 Result Cache 详解
Oracle 内存 Result Cache 详解
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Result Cache 缓存查询/函数结果[1]:
2. 类型
2.1 SQL Query Result Cache
- 查询结果
- 自动失效
- 透明
2.2 PL/SQL Function Result Cache
- 函数结果
- RELIES_ON
- 跨会话
2.3 Client Result Cache
- 客户端
- OCI
- 减少网络
3. 配置
3.1 内存
ALTER SYSTEM SET result_cache_max_size = 1G;
ALTER SYSTEM SET result_cache_max_result = 5;
ALTER SYSTEM SET result_cache_mode = MANUAL; -- 或 FORCE
3.2 查看
SHOW PARAMETER result_cache;
SELECT * FROM v$result_cache_statistics;
4. SQL Result Cache
4.1 Hint
SELECT /*+ RESULT_CACHE */ * FROM employees WHERE dept_id = 10;
4.2 FORCE
ALTER SYSTEM SET result_cache_mode = FORCE;
-- 所有查询自动缓存
4.3 失效
- 表数据变更
- 自动失效
- 依赖
5. PL/SQL Result Cache
5.1 函数
CREATE OR REPLACE FUNCTION get_dept_name(p_id NUMBER) RETURN VARCHAR2
RESULT_CACHE RELIES_ON (departments)
IS
v_name VARCHAR2(100);
BEGIN
SELECT name INTO v_name FROM departments WHERE id = p_id;
RETURN v_name;
END;
/
5.2 包
CREATE OR REPLACE PACKAGE dept_pkg AS
FUNCTION get_name(p_id NUMBER) RETURN VARCHAR2
RESULT_CACHE RELIES_ON (departments);
END;
/
5.3 失效
- RELIES_ON 表变更
- 自动失效
- 重计算
6. 查看
6.1 视图
SELECT * FROM v$result_cache_statistics;
SELECT * FROM v$result_cache_memory;
SELECT * FROM v$result_cache_objects;
SELECT * FROM v$result_cache_dependency;
6.2 统计
SELECT name, value FROM v$result_cache_statistics;
-- Create Count Success
- Find Count
- Invalidation Count
- Delete Count
7. 管理
7.1 清空
EXEC DBMS_RESULT_CACHE.FLUSH;
EXEC DBMS_RESULT_CACHE.BYPASS(TRUE);
EXEC DBMS_RESULT_CACHE.BYPASS(FALSE);
7.2 报告
SELECT DBMS_RESULT_CACHE.STATUS FROM dual;
SELECT DBMS_RESULT_CACHE.MEMORY_REPORT FROM dual;
8. 限制
8.1 不支持
- 临时表
- 不确定函数
- 序列
- SYSDATE
- USER
8.2 大小
- 结果大小限制
- LRU 淘汰
8.3 一致性
- 读一致性
- 隔离级别
9. 应用场景
9.1 频繁查询
- 字典表
- 配置
- 很少变
9.2 复杂计算
- 复杂函数
- 重复调用
- 性能
9.3 报表
- 重复报表
- 短时间缓存
10. 性能
10.1 优势
- 跳过计算
- 快速返回
- 跨会话
10.2 开销
- 内存
- 失效管理
- 监控
10.3 命中率
SELECT name, value FROM v$result_cache_statistics
WHERE name IN ('Find Count', 'Create Count Success');
-- 命中率 = Find / (Find + Create)
11. Client Result Cache
11.1 配置
# sqlnet.ora
OCI_RESULT_CACHE_MAX_SIZE = 1048576
11.2 Hint
SELECT /*+ RESULT_CACHE */ * FROM ...;
11.3 优势
- 客户端缓存
- 减少网络
- 性能
12. 监控
12.1 使用
SELECT type, status, name, cache_id
FROM v$result_cache_objects
ORDER BY creation_timestamp DESC;
12.2 命中
SELECT name, value
FROM v$result_cache_statistics
ORDER BY name;
12.3 失效
SELECT * FROM v$result_cache_objects WHERE status = 'Invalid';
13. 常见问题
13.1 不缓存
- 不支持
- 大小
- 检查
13.2 内存
- result_cache_max_size
- 监控
13.3 一致性
- 自动失效
- RELIES_ON
14. 最佳实践
- 字典表:缓存
- 频繁函数:RESULT_CACHE
- RELIES_ON:必须
- 监控:命中率
- 大小:合理
- FORCE 谨慎:评估
- 不缓存不稳定:SYSDATE
- 测试:性能
- 文档:标记
- 演练:定期
15. 参考资料
[1] Oracle Database SQL Tuning Guide 19c, “Result Cache” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/