
ORDER BY 通常会有两种实现方法,一个是利用有序索引自动实现,也就是说利用有序索引的有序性就不再另做排序操作了。另一个是把结果选好之后再排序。用有序索引是最快的,但是有一些限制条件:
当order by 字段出现在where条件中时,才会利用索引而无需排序操作。其他情况,order by不会出现排序操作。
null值不会被存储到B树索引。因此应该为表的索引列添加 not null 约束。
创建测试环境
SQL> drop table t purge;
SQL> create table t as select * from dba_objects ;
SQL> set autotrace traceonly
SQL> select count(*) from t order by object_id;
没有排序。
以下语句发生排序
SQL> drop table t purge;
SQL> create table t as select * from dba_objects;
以上语句没有索引,又有order by,产生了排序。
增加索引避免排序
给t表增加索引:
SQL> create index idx_t_object_id on t(object_id);
SQL> set autotrace traceonly
再来执行以上语句:
SQL> select * from t where object_id>2 order by object_id;
当order by 字段出现在where条件中时,会利用该字段的索引本身有序的特点而避免排序。
以下情况Oracle会选择用索引(回表取消了)
SQL> select object_id from t where object_id>2 order by object_id;
以下情况Oracle就不会用索引了
SQL> select object_id from t where object_id>2;










