Oracle 内存 Result Cache 详解

Oracle 内存 Result Cache 详解

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Result Cache 缓存查询/函数结果[1]:

详细见:Oracle 结果缓存 Result Cache


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. 最佳实践

  1. 字典表:缓存
  2. 频繁函数:RESULT_CACHE
  3. RELIES_ON:必须
  4. 监控:命中率
  5. 大小:合理
  6. FORCE 谨慎:评估
  7. 不缓存不稳定:SYSDATE
  8. 测试:性能
  9. 文档:标记
  10. 演练:定期

15. 参考资料

[1] Oracle Database SQL Tuning Guide 19c, “Result Cache” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/