gpt4 book ai didi

sql - 从表中选择 MIN 和 MAX 比预期的要慢

转载 作者:行者123 更新时间:2023-12-03 10:28:22 26 4
gpt4 key购买 nike

我有一张 table 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:

enter image description here

计划2:

enter image description here

最佳答案

索引全扫描只能访问索引的一侧。当你在做

SELECT MIN(SDATE), MAX(SDATE) FROM MYTABLE

您要求访问 2 个方面。因此,如果您想要最小和最大列值,索引完全扫描是不可行的。

更详细的分析你可以找到 here .

关于sql - 从表中选择 MIN 和 MAX 比预期的要慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12565790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com