码迷,mamicode.com
首页 > 数据库 > 详细

分页sql优化

时间:2015-09-17 13:30:40      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

如果分页sql里包含排序:

select * from (...order by id) where rownum <=20

因为要排序,所以即使是分页只取20条,执行计划还是要把所有满足条件的记录到取出来,然后再整体进行排序,再取结果的20条返回。

假如满足条件的结果很多,这个sql的性能会比较差。

 

如何避免排序?

 

可以给order by的字段加索引,由于索引本来就是按顺序的,所以按索引取前20条就可以,不需要再排序,就不需要查出所有满足条件的记录。

sql性能大大提高。

 

但是,如果order by字段是非空字段,oracle的空值是走不了索引,怎么办?

一个方法是,order by的字段尽量是主键或非空字段,当然这是不能保证的。

另一个方法是,增加这样的组合索引 index(id, 0),由于加入了常量0,这样就一定不是空值。当然与主键做组合索引也是同样道理,然而常量0比较省空间。

 

最后,如果order by字段来自标量子查询,那就算加了索引也是没用,这种情况只能尽量把sql改成表连接,而不用子查询(当然,有些时候会改变sql的业务含义)。

 

分页sql优化

标签:

原文地址:http://www.cnblogs.com/attlia/p/4815990.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!