min ? max ? 执行计划?

简介: create table big_table as select * from dba_objects;insert into big_table select * from big_table;insert into big_table select * ...

create table big_table as select * from dba_objects;
insert into big_table select * from big_table;
insert into big_table select * from big_table;

ALTER TABLE BIG_TABLE MODIFY(OBJECT_ID NULL);

CREATE INDEX I_BT_OBJECT_ID ON BIG_TABLE(OBJECT_ID)

select min(object_id),max(object_id) from big_table;

第1次看到类似的sql语句的时候,感觉会使用索引,并且会走
index full scan (min/max).但是仔细看执行计划发现,发现是使用全表扫描。修改约束OBJECT_ID NOT NULL,仅仅计划变为INDEX FAST FULL SCAN。


修改为
SELECT MIN (object_id), MAX (object_id)
FROM big_table
WHERE object_id IS NOT NULL;

执行计划走INDEX FAST FULL SCAN。

但是单独写SELECT MIN (object_id) FROM big_table;
执行计划就是INDEX FULL SCAN (MIN/MAX)。

如何要执行类似的sql应该将sql语句修改如下:
SELECT a.m1, b.m2
FROM (SELECT MAX (object_id) m1
FROM big_table) a,
(SELECT MIN (object_id) m2
FROM big_table) b

对比如下:
Execution Plan
----------------------------------------------------------
Plan hash value: 2118989048

-----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 26 | 6 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 1 | 26 | 6 (0)| 00:00:01 |
| 2 | VIEW | | 1 | 13 | 3 (0)| 00:00:01 |
| 3 | SORT AGGREGATE | | 1 | 5 | | |
| 4 | INDEX FULL SCAN (MIN/MAX)| I_BT_OBJECT_ID | 405K| 1978K| 3 (0)| 00:00:01 |
| 5 | VIEW | | 1 | 13 | 3 (0)| 00:00:01 |
| 6 | SORT AGGREGATE | | 1 | 5 | | |
| 7 | INDEX FULL SCAN (MIN/MAX)| I_BT_OBJECT_ID | 405K| 1978K| 3 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
6 consistent gets
0 physical reads
0 redo size


SELECT MIN (object_id), MAX (object_id)
FROM big_table
WHERE object_id IS NOT NULL;

----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5 | 307 (4)| 00:00:04 |
| 1 | SORT AGGREGATE | | 1 | 5 | | |
| 2 | INDEX FAST FULL SCAN| I_BT_OBJECT_ID | 405K| 1978K| 307 (4)| 00:00:04 |
----------------------------------------------------------------------------------------


Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
1386 consistent gets
0 physical reads
0 redo size


再回到生产系统,一般要执行类似的sql,比如:

select min(a),max(a) from t where xx=:1 ,如果索引建立再xx,a上,如果xx的重复值很多,这样写效率就不高。

目录
相关文章
|
6月前
|
SQL 数据库
MAX() 函数
MAX() 函数
56 6
|
移动开发 安全 JavaScript
MAX4/11/03/016/08/1/1/00 MAX-4/11/01/008/08/1/1/00
MAX4/11/03/016/08/1/1/00 MAX-4/11/01/008/08/1/1/00
56 0
|
7月前
|
SQL 关系型数据库 数据处理
详解SQL语句中的GROUP BY和聚合函数COUNT、SUM、AVG、MIN和MAX。
详解SQL语句中的GROUP BY和聚合函数COUNT、SUM、AVG、MIN和MAX。
978 0
|
7月前
|
编译器 C++
C++ max函数与min函数
C++ max函数与min函数
241 0
|
关系型数据库 MySQL
MySQL开窗聚合函数——SUM(),AVG(),MIN(),MAX()
MySQL开窗聚合函数——SUM(),AVG(),MIN(),MAX()
379 0
MySQL开窗聚合函数——SUM(),AVG(),MIN(),MAX()
C400/A8/1/1/1/00 MAX-4/11/03/128/99/1/0/00
C400/A8/1/1/1/00 MAX-4/11/03/128/99/1/0/00
39 0
|
算法 C++
10min快速回顾C++语法(一)
本系列文章旨在短时间内回顾C/C++语法中的重点与易错点,巩固算法竞赛与写题过程中常用的语法知识,精准地解决学过但有遗忘的情况,为算法刷题打下坚实的基础。
124 0
|
SQL 关系型数据库 测试技术
PostgreSQL 流式统计 - insert on conflict 实现 流式 UV(distinct), min, max, avg, sum, count ...
标签 PostgreSQL , 流式统计 , insert on conflict , count , avg , min , max , sum 背景 流式统计count, avg, min, max, sum等是一个比较有意思的场景,可用于实时大屏,实时绘制统计图表。
5476 0
|
Oracle 关系型数据库 索引
20180316不使用INDEX FULL SCAN (MIN/MAX)
[20180316]为什么不使用INDEX FULL SCAN (MIN/MAX).txt --//链接:http://www.itpub.net/thread-2100456-1-1.
1191 0