Oracle DB对集群表的第一个查询做了什么?

时间:2015-05-27 14:25:33

标签: sql oracle

我们对oracle集群和集群表有疑问。

基本上我们创建了一个集群,一个集群表和一个集群索引:

create cluster testcluster1(id number(5)) size 1000 storage(initial 1024m);

create table test_tab1(id number(5), num number(5), str2 varchar2(20),str3 varchar2(20)) cluster testcluster1(id);

create index test1clusterindex on cluster testcluster1;

然后我们将数据插入表中:

declare

  lower NUMBER := 1;

  upper NUMBER := 10000000;

begin

  FOR i In lower .. upper LOOP

    INSERT INTO test_tab1 VALUES(floor(i / 800000),

                           floor(i / 800000),

                           'xxxxxxxxxxxxxxxxxxx',

                           'xxxxxxxxxxxxxxxxxxx');
  END LOOP;

end;

普通全表扫描所需的时间是~6s:

select sum(t.num) from TEST_TAB1 t;

第一次查询群集扫描所需的时间是~61s:

select sum(t.num) from TEST_TAB1 t where t.id <= 4

同一群集扫描的后续查询超快(~0.4s),因为群集,群集表和群集索引被加载到默认缓冲区缓存中(我们知道这是因为刷新缓冲区缓存会恢复长时间群集扫描的时间~61s)。但除了在集群扫描的第一个查询中加载集群和集群表(即使是全表扫描大约需要6秒)之外,Oracle DB还应该做其他事情(需要大约55秒)。

所以我们这里的问题是oracle DB在这个〜55s时间内在群集扫描的第一个查询中做了什么?任何意见将不胜感激!

1 个答案:

答案 0 :(得分:0)

第一个查询执行完整扫描并按顺序读取块。第二个查询对集群索引执行范围扫描,并访问每个id的表。这导致更多逻辑读取以及随机读取。结果是查询速度较慢。从解释计划开始,您将看到访问路径;那么你可以运行统计或自动跟踪,看看会发生什么!