问题:
根据STATUS='TABLE',查询最大值LAST_DDL_TIME,STATUS='TABLE' 符合条件记录数超过几十万,怎么优化?
sql如下:
SELECT TO_CHAR(MAX(LAST_DDL_TIME),'YYYY-MM-DD HH24:MI:SS') from t1015 where STATUS='TABLE';
模拟测试:
1.创建测试表
create table t1015 as select * from dba_objects;
SELECT TO_CHAR(MAX(LAST_DDL_TIME),'YYYY-MM-DD HH24:MI:SS') from t1015 where STATUS='TABLE';
2.全表扫描 逻辑读1238
3. INDEX RANGE SCAN (MIN/MAX) 逻辑读为3
创建组合索引(STATUS,LAST_DDL_TIME),执行计划走INDEX RANGE SCAN (MIN/MAX),利用索引有序特性直接取到最大值。
SYS@db11g> create index idx_t1015 on t1015(STATUS,LAST_DDL_TIME) online;
Index created.
4.INDEX FAST FULL SCAN 逻辑读311
如果创建索引时,调换索引顺序(LAST_DDL_TIME,STATUS),则无法使用到INDEX RANGE SCAN (MIN/MAX),只能走INDEX FAST FULL SCAN,逻辑读311。
SYS@db11g> create index idx_t101502 on t1015(LAST_DDL_TIME,STATUS) online;
Index created.
总结:
当需要根据某一列的记录,获取另外一列的最大值最小值时,可以创建索引进行INDEX RANGE SCAN (MIN/MAX),利用索引有序特性直接取到最大值,提高查询效率。
INDEX RANGE SCAN (MIN/MAX) 是数据库优化器在处理 MIN 和 MAX 函数时采用的一种索引扫描策略。这种策略从根本上利用了索引的有序性,直接定位到索引的最小或最大值位置,从而快速返回结果。
标签:STATUS,INDEX,LAST,SCAN,MAX,MIN From: https://blog.csdn.net/Story_begins/article/details/142961773