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
相关产品推荐
相关产品推荐

