You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 11.2查询性能测试:如何关闭/清除缓存且不影响其他用户

在Oracle 11.2中清除缓存进行可靠性能测试(不影响其他用户)

我在Oracle 11gR2环境做性能测试时经常遇到这个问题——数据库缓存会把查询结果或执行计划存起来,导致后续测试的速度失真。下面是几个对其他用户影响极小的方案,按安全性从高到低排序:

1. 仅针对当前会话的缓存控制(最安全)

这个方案完全不会影响其他用户,所有操作只作用于你自己的测试会话:

1.1 强制SQL不使用Buffer Cache(数据缓存)

在你的测试SQL中添加/*+ NO_CACHE */提示,告诉Oracle不要将本次查询读取的数据块放入Buffer Cache,同时也不会优先从缓存中读取已有块(针对全表扫描场景)。示例:

SELECT /*+ NO_CACHE FULL(employees) */ * FROM employees WHERE department_id = 10;

如果是索引扫描场景,可以搭配索引提示一起使用:

SELECT /*+ INDEX(employees emp_dept_idx) NO_CACHE */ last_name, salary FROM employees WHERE department_id = 10;

1.2 清除当前会话的执行计划缓存(共享池)

如果你想确保每次测试都重新生成执行计划(而不是复用缓存里的历史计划),可以执行:

ALTER SESSION SET OPTIMIZER_USE_SQL_PLAN_BASELINES = FALSE;
ALTER SESSION FLUSH SHARED_POOL;

如果想精准清除某一条SQL的执行计划,先通过V$SQL视图找到该SQL的SQL_ID,再执行:

EXEC DBMS_SHARED_POOL.PURGE('SQL_ID,0', 'C');

这里的0表示子游标编号,'C'代表游标类型,操作只会影响当前会话关联的缓存对象。

2. 针对特定对象的缓存设置(影响范围可控)

如果你的测试只涉及特定表/索引,可以修改对象的缓存属性,既避免被其他用户的缓存干扰,也尽量不影响其他用户的正常查询:

2.1 禁止表的全表扫描数据进入Buffer Cache

ALTER TABLE your_test_table NOCACHE;

这个设置会让后续对该表的全表扫描不将数据块存入Buffer Cache,测试完成后记得改回默认设置:

ALTER TABLE your_test_table CACHE;

2.2 将对象放入Recycle缓冲池

把测试对象分配到Recycle缓冲池,这样数据块用完后会被优先回收,不会长期占用缓存空间:

ALTER TABLE your_test_table STORAGE(BUFFER_POOL RECYCLE);

测试结束后改回默认的缓冲池:

ALTER TABLE your_test_table STORAGE(BUFFER_POOL DEFAULT);

3. 全局缓存清除(谨慎使用)

这个方案会清除整个数据库的缓存,会显著影响所有用户,只适合在测试环境或非业务高峰时段使用,且需要SYSDBA权限:

3.1 清除Buffer Cache(数据缓存)

ALTER SYSTEM FLUSH BUFFER_CACHE;

3.2 清除Shared Pool(执行计划、存储过程等缓存)

ALTER SYSTEM FLUSH SHARED_POOL;

注意:全局清除后,所有用户的第一次查询都会变慢,因为需要重新从磁盘读取数据并生成执行计划,一定要提前确认业务影响范围。


内容的提问来源于stack exchange,提问作者hakobot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:18:56