资讯专栏INFORMATION COLUMN

Order by之索引优化

IT那活儿 / 601人阅读
Order by之索引优化
更多精彩推荐,请关注我们


   通常我们会选择在合适的谓词条件列添加索引,以达到加速查询的效果。今天给大家介绍下以orderby列创建索引加速查询的例子,话不多说,往下看。

    首先我们利用dba_objects创建一个测试表如下:

create table test as select * from dba_objects;

--执行多次插入,让数据量达到千万级别

insert into test select * from test;

案例一

  表创建好后执行如下语句:

select* from (select * from test order by object_id) where rownum<=20;

  执行计划如下图,可以看到走的是全表扫描,执行时间17.58s。这也是意料之中的。

  当然我们已经说了今天介绍的是以orderby列创建索引加速查询的例子,先把索引建上:

createindex index_tt on test(object_id);

  再次执行上述语句,发现执行计划仍是全表扫描,sql执行效率没有任何变化。在这里我们修改下object_id列的属性为非空:

altertable test modify object_id not null;

  然后执行上述语句,执行计划如下图,可以发现现在使用到了我们刚刚创建的索引,sql执行时间只需0.13s,sql执行效率大幅提升。


案例二

  在实际生产中我们遇到的sql要比案例一复杂的多,接下来我们看一个复杂一点的案例:

selectobject_id,object_type from (select * from test where object_type like%TABLE% order by object_id) where rownum<=20;

  案例二中sql加了where条件,且我们可以条件的object_type列的选择性非常差,不适合建立索引。执行上述语句后执行计划如下,仍然使用到了我们刚刚建立在orderby列的索引。

  那么这条语句还有没有优化空间呢,我们尝试在object_id和object_type列建立复合索引如下:

createindex index_tt1 on test(object_id,object_type);

  再次执行上述案例语句,执行计划走了刚刚创建的复合索引,执行效率也所有提升。


总结

  • 索引是有序的,而当sql中有order by时,可以考虑在order by字段列建立索引以提高语句执行效率;

  • 在Oracle中null被定义为无限大,且null不等于null,故在索引中不会存有与null值对应的条目,在上述案例中如果不修改object_id列属性为not null,优化器无法确定该列是否有null值,优化器仍然会选择全表扫描;

  • 当语句比较复杂且带谓词条件时,可以结合order by列建立复合索引。



发现“在看”和“赞”了吗,戳我试试吧



文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/130040.html

相关文章

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<