У меня есть таблица 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:
Plan2: