为什么Oracle RESULT_CACHE没有减少LAST_CR_BUFFER的数量?

时间:2015-07-29 15:24:01

标签: oracle caching oracle11g

我正在使用Oracle result_cache进行一些测试,并且遇到了一些看起来很奇怪的东西(无论如何)。

我创建了下表:

create table CACHE_TEST(
  COL1 int,
  COL2 int
);

并在其中插入了一些虚拟数据:

insert into CACHE_TEST select * from(
  select level as COL1, level*3 as COL2 from DUAL
  connect by level <= 100
);

现在我在以下查询中运行Autotrace:

select * from CACHE_TEST;

正如预期的那样,它显示正常的全表扫描。然后,我对以下查询多次运行Autotrace,并期望它使用结果缓存:

select /*+ RESULT_CACHE */ * from CACHE_TEST;

Autotrace显示它确实使用了缓存,但缓冲区获取和成本的数量与第一个查询完全相同。

有趣的是,如果我做某种聚合,例如:

select /*+ RESULT_CACHE */ AVG(COL1) FROM CACHE_TEST;

它减少了缓冲区变为零,但成本仍然相同。

任何人都可以解释原因:

  • 除非你进行聚合,否则结果缓存似乎不会减少缓冲区的数量?
  • 即使它确实使用了结果缓存,但据报道成本仍然相同(即使我看到显着的性能提升)?

1 个答案:

答案 0 :(得分:0)

如果您从表中选择了所有数据,为什么您需要更少的读取来从表中读取所有数据(这可能完全在缓冲区缓存中)而不是从结果缓存中读取?无论哪种方式,您都可以读取相同数量的块并获得相同数量的数据。

当您的查询执行某种昂贵的计算时,结果缓存非常有用。这可能是一个聚合 - 读取单个缓存值显然比从表中读取每一行更有效。或者它可能是一个查询,它做了很多工作来确定要读取的表的哪个子集(例如,通过其他表连接)。