通常我们会选择在合适的谓词条件列添加索引,以达到加速查询的效果。今天给大家介绍下以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
阅读 1356·2023-01-11 13:20
阅读 1707·2023-01-11 13:20
阅读 1215·2023-01-11 13:20
阅读 1906·2023-01-11 13:20
阅读 4165·2023-01-11 13:20
阅读 2757·2023-01-11 13:20
阅读 1402·2023-01-11 13:20
阅读 3671·2023-01-11 13:20