我正在使用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;
它减少了缓冲区变为零,但成本仍然相同。
任何人都可以解释原因:
答案 0 :(得分:0)
如果您从表中选择了所有数据,为什么您需要更少的读取来从表中读取所有数据(这可能完全在缓冲区缓存中)而不是从结果缓存中读取?无论哪种方式,您都可以读取相同数量的块并获得相同数量的数据。
当您的查询执行某种昂贵的计算时,结果缓存非常有用。这可能是一个聚合 - 读取单个缓存值显然比从表中读取每一行更有效。或者它可能是一个查询,它做了很多工作来确定要读取的表的哪个子集(例如,通过其他表连接)。