分页sql优化
2015-09-17 12:28
274 查看
如果分页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的业务含义)。
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的业务含义)。
相关文章推荐
- mysql 修改root密码
- MongoDB备份
- 建索引让SQL飞起来
- SQL中的事务隔离级别
- Redis Error
- Oracle 11g Dataguard参数详解
- DB2数据库全系列版本安装介质下载地址
- mysql 修改root密码
- VB.NET读写MongoDB
- MySQL Study之--MySQL innodb存储与索引的总结
- hibernate4操作数据库blob案例
- Mac下通过Homebrew安装配置MySQL
- 运维进行时-修改数据库密码
- Ubuntu下mysql安装,登录
- Express调用mssql驱动公共类dbHelper
- mysql事件调度器
- NoSQL数据库:Redis适用场景及产品定位
- SQL Server 三大物理连接算法(嵌套,合并,哈希)的IO成本总结
- SQL Server中行列转换 Pivot UnPivot
- mysql 主从复制读写分离