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. 最佳实践
- 静态数据缓存:字典
- 聚合查询缓存:报表
- PL/SQL 函数:计算
- RELIES_ON 声明:失效
- 监控命中率:效益
- 合理大小:平衡
- 避免 DDL 频繁:失效
- 测试验证:效果
- 结合内存:综合
- 定期清理:维护
12. 参考资料
[1] Oracle Database Performance Tuning Guide 19c, “Result Cache” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/result-cache.html