我在Oracle数据库上调优SQL查询。我想确保在运行每个查询之前清除所有缓存的项目,以防止误导性能结果。我通过运行以下命令清除共享池(以消除缓存的SQL /解释计划)和缓冲区缓存(以摆脱缓存的数据):
alter system flush buffer_cache;
alter system flush shared_pool;
我应该做的还有更多,还是足够?
谢谢!
答案 0 :(得分:8)
刷新共享池应该这样做,但是Tom Kyte在下面列出了几个原因,为什么在某些情况下你可能无法得到你期望的结果:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6349391411093
答案 1 :(得分:4)
请记住,操作系统和硬件也会进行缓存,这会导致结果出现偏差。
答案 2 :(得分:3)
您还应该收集统计信息 - 无论是您的架构还是整个数据库:
begin
dbms_stats.gather_schema_stats('schema_name');
end;
或
begin
dbms_stats.gather_database_stats;
end;
然后清除共享池。
答案 3 :(得分:1)
我认为你会提出误导性的结果因为你已经清除了所有的缓存。现实世界中的数据库,只有在其生命中曾经存在过一次。 事实上,在进行性能测试时,多次运行查询通常是一种公认的做法,这样您就可以看到缓存(和其他优化)的好处。