如何清除Oracle中的所有缓存项

Posted

技术标签:

【中文标题】如何清除Oracle中的所有缓存项【英文标题】:How to clear all cached items in Oracle 【发布时间】:2011-01-09 23:40:33 【问题描述】:

我正在调整 Oracle 数据库上的 SQL 查询。我想确保在运行每个查询之前清除所有缓存的项目,以防止误导性能结果。我通过运行以下命令清除了共享池(以摆脱缓存的 SQL/解释计划)和缓冲区缓存(以摆脱缓存的数据):

alter system flush buffer_cache;
alter system flush shared_pool;

我还有什么需要做的吗,还是足够了?

谢谢!

【问题讨论】:

【参考方案1】:

刷新共享池应该可以做到,但 Tom Kyte 在下面列出了一些原因,说明在某些情况下您可能无法获得预期的结果:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6349391411093

【讨论】:

哇,这是一个很好的链接,提供了一些非常好的信息。感谢分享!【参考方案2】:

请记住,操作系统和硬件也会进行缓存,这可能会影响您的结果。

【讨论】:

是的,当查询运行速度比平时更快时,即使在清除缓冲区缓存之后,这绝对是我想知道的问题。感谢您的提示!【参考方案3】:

您还应该收集统计信息 - 无论是您的架构还是整个数据库:

begin
   dbms_stats.gather_schema_stats('schema_name');
end;

begin
   dbms_stats.gather_database_stats;
end;

然后清除共享池。

【讨论】:

【参考方案4】:

我认为您会提供误导性结果因为您已清除所有缓存。现实世界中的数据库,在其生命中只处于这种状态一次。 事实上,在进行性能测试时,多次运行查询通常是一种公认​​的做法,这样您就可以看到缓存(和其他优化)的好处。

【讨论】:

以上是关于如何清除Oracle中的所有缓存项的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net 何时删除过期的缓存项?

Redis:基于依赖项的缓存项失效?

跨负载平衡服务器的选择性缓存清除 (ASP.Net)

编程实践关于应用层的本地内存缓存框架的代码实现

laravel框架学习-缓存,事件

更改 ASP.NET 缓存项过期的频率?