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

标签 sql oracle oracle11g oracle11gr2

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

相关文章:

sql - 世界上最简单的 Postgresql ... 不工作?

mysql - SQL GROUP BY 和 DOUBLE VALUE 属性

oracle - Hive 中的隐式数据类型转换

mysql - 检查数据库中以出生日期格式存储在列中的值

c# - sql中如何过滤空值

node.js - npm install oracledb 给出错误 : Cannot find $OCI_LIB_DIR/libclntsh. dylib

java - OAF 如何将带有搜索字段的高级表添加到标准现有页面(EBS 12.1)?

mysql - 三个或更多表 JOIN USING USING common key

oracle - 如何将 SELECT LISTAGG 值插入到 varchar 变量

java - Hibernate Criteria API 中两个属性之间的日期