# Order by之索引优化

> 作者/来源: UCloud 运营管理员
> 发布时间: 2023-01-11T05:20:00.000Z
> 分类: CDN
> 原文链接: http://117.50.162.249:3000/yun/articles/881

---

# Order by之索引优化

> 来源: https://www.ucloud.cn/yun/130040.html
> 作者: IT那活儿
> 发布日期: 发布于2023-01-11 13:20

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。这也是意料之中的。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/130040/images/130040_000.png)

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

|  |
| --- |
| createindex index\_tt on test(object\_id); |

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

|  |
| --- |
| altertable test modify object\_id not null; |

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

![](https://ucloud-blog.cn-bj.ufileos.com/articles/130040/images/130040_001.png)

**案例二**

在实际生产中我们遇到的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列的索引。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/130040/images/130040_002.png)

  那么这条语句还有没有优化空间呢，我们尝试在object\_id和object\_type列建立复合索引如下：

|  |
| --- |
| createindex index\_tt1 on test(object\_id,object\_type); |

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

![](https://ucloud-blog.cn-bj.ufileos.com/articles/130040/images/130040_003.png)

**总结**

- 索引是有序的，而当sql中有order by时，可以考虑在order by字段列建立索引以提高语句执行效率；
- 在Oracle中null被定义为无限大，且null不等于null，故在索引中不会存有与null值对应的条目，在上述案例中如果不修改object\_id列属性为not null，优化器无法确定该列是否有null值，优化器仍然会选择全表扫描；
- 当语句比较复杂且带谓词条件时，可以结合order by列建立复合索引。

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

![](https://ucloud-blog.cn-bj.ufileos.com/articles/130040/images/130040_004.png)