--创建测试表和索引
drop table t purge;
create table t as select * from dba_objects;
create index idx_object_id on t(object_id);

--全表扫描TABLE ACCESS FULL
select count(*) from t;

--索引扫描INDEX FAST FULL SCAN,加上非空判断之后,就会走索引扫描了
select count(*) from t where object_id is not null;

--为了避免这种蹩脚的写法,可以将该列设置为非空,或者设置为主键

--在使用类似于avg或者sum函数的时候,如果走索引也应该设置为非空
select avg(object_id) from t where object_id is not null;

--对于这条语句的执行效率和分开执行的效率是一致的
select avg(object_id),sum(object_id),count(*) from t where object_id is not null;

--对于max和min,只要有索引列,max和min无需设置非空,即可快速完成查询。使用的扫描方式是INDEX FULL SCAN,这种速度是非常快的
select max(object_id) from t;

--把两个放在一块写的时候就会换一种扫描方式INDEX FAST FULL SCAN,这样速度就会慢很多
select max(object_id),min(object_id) from t

--对于这种情况可以使用,这是对表进行INDEX FULL SCAN,执行的复杂度是单独执行的两倍,但是就这也比上面的情况快很多
select a.max ,b.min from (select max(object_id) max from t) a, (select min(object_id) min from t) b;