我有一个表MYTABLE
,它的日期列为SDATE
,它是表的主键,并且具有唯一的索引。从表中选择最小值和最大值比预期的要慢
当我运行此查询:
SELECT MIN(SDATE) FROM MYTABLE
它给回答瞬间。同样的情况适用于:
SELECT MAX(SDATE) FROM MYTABLE
但是,如果我查询两者一起:
SELECT MIN(SDATE), MAX(SDATE) FROM MYTABLE
它需要更多的时间来执行。我分析了这些计划,发现在查询最小或最大值时,它使用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:
表中有多少行?统计数据有多新鲜? – APC
我的桌子有近100000行,数据很新;您可以通过创建一个只有一列或两列的简单表格轻松地重新生成问题,并亲自查看结果。 – RGO
查询的费用是多少?你可以发布计划吗?我认为这个指数非常分散。 –