分页sql优化

如果分页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的业务含义)。

 

posted @ 2015-09-17 12:28  喵尾景虎  阅读(230)  评论(0编辑  收藏  举报