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