Oracle 结果缓存(Result Cache)

Oracle 结果缓存(Result Cache)

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


1. 概述

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

类型

  • SQL Query Result Cache
  • PL/SQL Function Result Cache
  • Client Result Cache

2. 配置

2.1 启用

ALTER SYSTEM SET result_cache_mode = MANUAL SCOPE=BOTH;
-- MANUAL(默认):HINT 控制
-- FORCE:自动缓存所有查询

2.2 大小

ALTER SYSTEM SET result_cache_max_size = 100M SCOPE=SPFILE;

2.3 查看

SHOW PARAMETER result_cache

3. SQL Query Result Cache

3.1 HINT

SELECT /*+ RESULT_CACHE */ 
  dept_id, AVG(salary)
FROM employees
GROUP BY dept_id;

3.2 验证

EXPLAIN PLAN FOR SELECT /*+ RESULT_CACHE */ ...;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- RESULT CACHE

3.3 失效条件

  • 表数据变更
  • DDL 操作
  • 缓存满

4. PL/SQL Function Result Cache

4.1 声明

CREATE OR REPLACE FUNCTION get_dept_name(p_dept_id NUMBER) 
RETURN VARCHAR2 RESULT_CACHE RELIES_ON (departments) 
AS
  v_name VARCHAR2(100);
BEGIN
  SELECT dept_name INTO v_name FROM departments WHERE id = p_dept_id;
  RETURN v_name;
END;
/

4.2 优势

  • 函数结果缓存
  • 自动失效(依赖表变更)
  • 跨会话共享

4.3 限制

  • 仅函数
  • 不能有 OUT 参数
  • 不能依赖 session 状态
  • 不能在事务中

5. 查看

5.1 缓存使用

SELECT 
  type,
  status,
  name,
  row_count,
  cache_id
FROM v$result_cache_objects;

5.2 统计

SELECT 
  name, 
  value 
FROM v$result_cache_statistics;

5.3 内存

SELECT 
  name, 
  value / 1024 / 1024 AS mb 
FROM v$result_cache_statistics 
WHERE name IN ('Maximum Cache Size', 'Create Count Success');

6. 管理

6.1 清空

EXEC DBMS_RESULT_CACHE.FLUSH;

6.2 失效

EXEC DBMS_RESULT_CACHE.INVALIDATE('SCOTT', 'GET_DEPT_NAME');

6.3 内存报告

SELECT DBMS_RESULT_CACHE.MEMORY_REPORT FROM dual;

7. 适用场景

7.1 静态数据查询

-- 字典表
SELECT /*+ RESULT_CACHE */ * FROM lookup_table WHERE id = 1;

7.2 聚合查询

-- 复杂聚合
SELECT /*+ RESULT_CACHE */ 
  dept_id, 
  SUM(salary), 
  AVG(salary)
FROM employees
GROUP BY dept_id;

7.3 函数缓存

-- 计算函数
CREATE OR REPLACE FUNCTION calc_tax(p_amount NUMBER) 
RETURN NUMBER RESULT_CACHE AS
BEGIN
  RETURN p_amount * 0.1;
END;
/

8. 不适用

  • 频繁变更的表
  • 大结果集
  • 用户特定数据
  • 时间相关查询

9. Client Result Cache

9.1 配置

ALTER SYSTEM SET client_result_cache_size = 100M SCOPE=SPFILE;
ALTER SYSTEM SET client_result_cache_lag = 1000 SCOPE=SPFILE;

9.2 客户端

-- OCI 应用
-- 自动缓存

10. 常见坑与排错

10.1 缓存不生效

-- 1. 检查 result_cache_max_size
SHOW PARAMETER result_cache_max_size

-- 2. 检查 HINT
-- 3. 检查 RELIES_ON
-- 4. 检查非确定性

10.2 缓存命中率低

-- 1. 数据频繁变更
-- 2. 缓存大小不足
-- 3. 查询参数变化

10.3 内存不足

-- 增大
ALTER SYSTEM SET result_cache_max_size = 200M SCOPE=SPFILE;

11. 最佳实践

  1. 静态数据缓存:字典
  2. 聚合查询缓存:报表
  3. PL/SQL 函数:计算
  4. RELIES_ON 声明:失效
  5. 监控命中率:效益
  6. 合理大小:平衡
  7. 避免 DDL 频繁:失效
  8. 测试验证:效果
  9. 结合内存:综合
  10. 定期清理:维护

12. 参考资料

[1] Oracle Database Performance Tuning Guide 19c, “Result Cache” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/result-cache.html