我有一个MYTABLE
带有日期列的表,SDATE
它是表的主键,并且上面有一个唯一索引。
当我运行此查询时:
SELECT MIN(SDATE) FROM MYTABLE
它立即给出答案。同样的情况发生在:
SELECT MAX(SDATE) FROM MYTABLE
但是,如果我一起查询:
SELECT MIN(SDATE), MAX(SDATE) FROM MYTABLE
执行需要更多时间。我分析了计划,发现当查询 min 或 max 之一时,它使用 INDEX FULL SCAN(MIN/MAX) 但是当同时查询两者时,它会执行 FULL TABLE SCAN。
为什么?
测试数据:
版本11g
create table MYTABLE
(
SDATE DATE not null,
CELL VARCHAR2(10),
data NUMBER
)
tablespace CHIPS
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
alter table MYTABLE
add constraint PK_SDATE primary key (SDATE)
using index
tablespace SYSTEM
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
负载表:
declare
i integer;
begin
for i in 0 .. 100000 loop
insert into MYTABLE(sdate, cell, data)
values(sysdate - i/24, 'T' || i, i);
commit;
end loop;
end;
收集统计数据:
begin
dbms_stats.gather_table_stats(tabname => 'MYTABLE', ownname => 'SYS');
end;
计划1:
计划2: