我有一個表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
查詢的費用是多少?你可以發佈計劃嗎?我認爲這個指數非常分散。 –