如何禁用Oracle缓存以进行性能测试

19

我正在测试一张新的数据汇总表格的实用性。

因此,我创建了两个过程来获取某个时间段内的数据,每个过程使用不同的表格来源。在我的C#控制台应用程序中,我只需调用其中一个。当我想要多次重复这个操作以获得良好的响应时间模式时,问题就开始了。

我得到了类似于这样的结果:1199,84,81,81,81,81,82,80,80,81,81,80,81,91,80,80,81,80

可能是我的Oracle 10g正在进行不恰当的缓存。

如何解决这个问题?

2个回答

11

编辑:请参阅 asktom 上的此线程,其中描述了如何以及为什么不要这样做。

如果您在测试环境中,则可以将表空间脱机然后再次联机:

ALTER TABLESPACE <tablespace_name> OFFLINE;
ALTER TABLESPACE <tablespace_name> ONLINE;

或者你可以尝试

ALTER SYSTEM FLUSH BUFFER_CACHE;

但是只在测试环境中进行测试。

当您在“真实”系统上进行测试时,第一次调用后获得的时间(那些使用缓存数据的时间)可能更有趣,因为您将拥有缓存数据。连续调用过程两次,并仅考虑您在随后执行中获得的性能结果。


在调用之前刷新,我得到了一些有趣的结果,如:1370、354、391、375、352、511、390、375、326、335、435、334、334、328、337、314、417、377、384、367、393。明天我会更深入地研究它,并分享我的结果。谢谢! - Custodio
2
你好@Peter Lang,我的表在系统表空间中,所以我不能将其脱机。然而,我不明白为什么我应该这样做?你能解释一下或建议一篇好的文章吗?谢谢。 - Custodio

6
可能是我的Oracle 10g进行了不恰当的缓存。
实际上,看起来Oracle正在进行一些完全适当的缓存。如果这些表将经常使用,则希望它们大部分时间都在缓存中。
编辑
在Peter的回答下,Luis在评论中说:
刷新调用之前,我得到了一些有趣的结果,如:1370,354,391,375,352,511,390,375,326,335,435,334,334,328,337,314,417,377,384,367,393。
这些发现很“有趣”,因为刷新意味着调用需要比行在DB缓存中时花费更长的时间,但不像第一次调用那样长。这几乎肯定是因为服务器已将物理记录存储在其物理缓存中。避免这种情况的唯一方法是在每个测试之前重新启动服务器,以真正运行空缓存。
或者学会正确地调整查询。了解数据库的工作原理是一个好的开始。而EXPLAIN PLAN比墙上时钟更好的调整辅助工具。了解更多信息。

好的,我明白在这种情况下缓存的重要性,但是在我的情况下,这些表不会被多次查询相同的时间间隔。我只想查看未使用缓存的响应时间,无论使用我的摘要表与否。不过还是谢谢你的建议,我很感激。+1 - Custodio
我看到了你的修改,这是个问题。你有没有关于更好的比较解决方案的建议,可以比较我的程序使用普通表和另一个使用汇总表的方法? - Custodio
我在调用过程之前清空了缓冲区并重复进行测试,结果如下:407、342、413、364、431、354、351、356、344、368、328、341、334、370、333、330、327、401、421、333(第一个结果不是最大的)。是否有一些函数可以查看物理缓存的状态或其他信息? - Custodio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接