高效分页的SQL技巧(以Oracle为例)-阿里云开发者社区

开发者社区> 技术小胖子> 正文

高效分页的SQL技巧(以Oracle为例)

简介:
+关注继续查看

一般的分页写法大概就是下面的样子(所谓的“三层嵌套”写法)


  1. SELECT *  
  2. FROM   (SELECT a.*  
  3.               ,rownum rn  
  4.         FROM   (SELECT * FROM table_name) a  
  5.         WHERE  rownum <= 40)  
  6. WHERE  rn >= 21 

在遇到显示数据表中1百万行以后的记录时,可能会出现性能问题。有人提出的解决方案是利用索引,首先通过扫描索引查出rowid,然后再通过rowid查出所需记录。这样做的问题是如果没有索引怎么办?以Oracle为例,下面是一个更具有一般意义的高效写法:


  1. SELECT *  
  2. FROM   <your table name> t  
  3. WHERE  ROWID IN (SELECT rwd  
  4.                  FROM   (SELECT t.rowid rwd  
  5.                                ,rownum  n  
  6.                          FROM   <your table name> t  
  7.                          WHERE  rownum <= 1000000 + 10)  
  8.                  WHERE  n >= 1000000

优化的思想是跳到第1百万位置时只是扫描了rowid,避免了扫描全部字段。当字段个数较多时,速度会有十倍的提升。本例在普通的设备上运行不到1秒就出来结果了。这一方法在千万级或亿级仍然存在问题,其原因在于循环次数并未减少。如果真有rwd这样一个字段,那么通过索引和分区等手段,也能够确保速度。不过,话又说回来,分页显示成百上千万条记录这样的事情,其欲达到的业务目的本身可否有更好的解决之道呢?





 本文转自 hexiaini235 51CTO博客,原文链接:http://blog.51cto.com/idata/1121453,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(1)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(1)
29 0
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(5)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(5)
27 0
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(3)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(3)
28 0
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(2)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(2)
26 0
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(7)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(7)
22 0
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(9)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(9)
33 0
查询MySQL字段注释的 5 种方法!(2)
查询MySQL字段注释的 5 种方法!(2)
28 0
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(8)
保姆级教程,终于搞懂脏读、幻读和不可重复读了!(8)
29 0
查询MySQL字段注释的 5 种方法!(5)
查询MySQL字段注释的 5 种方法!(5)
27 0
查询MySQL字段注释的 5 种方法!(3)
查询MySQL字段注释的 5 种方法!(3)
25 0
21119
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载