暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle性能优化:SQL优化思路之八——索引有序化order by

oracleEDU 2017-11-03
2183

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;

最后修改时间:2021-04-28 20:23:26
文章转载自oracleEDU,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论