我们对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时间内在群集扫描的第一个查询中做了什么?任何意见将不胜感激!
答案 0 :(得分:0)
第一个查询执行完整扫描并按顺序读取块。第二个查询对集群索引执行范围扫描,并访问每个id的表。这导致更多逻辑读取以及随机读取。结果是查询速度较慢。从解释计划开始,您将看到访问路径;那么你可以运行统计或自动跟踪,看看会发生什么!