テーブルの主キーであり、一意のインデックスを持つ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: