最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Oracle数据库怎么实现分页查询
时间:2022-06-29 10:02:27 编辑:袖梨 来源:一聚教程网
分页查询格式:
代码如下 | 复制代码 |
SELECT * FROM |
其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。
择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:
代码如下 | 复制代码 |
SELECT * FROM |
对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。
这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。
而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。
下面再附一些相关的查询性能对比数据
1.根据ROWID来分
代码如下 | 复制代码 |
select * from t_xiaoxi where rowid in(select rid from (select rownum rn,rid from(select rowid rid,cid from t_xiaoxi order by cid desc) where rownum<10000) where rn>9980) order by cid desc; |
执行时间0.03秒
2.按分析函数来分
代码如下 | 复制代码 |
select * from (select t.*,row_number() over(order by cid desc) rk from t_xiaoxi t) where rk<10000 and rk>9980; |
执行时间1.01秒
3.按ROWNUM来分
代码如下 | 复制代码 |
select * from(select t.*,rownum rn from(select * from t_xiaoxi order by cid desc) t where rownum<10000) where |
rn>9980;执行时间0.1秒
其中t_xiaoxi为表名称,cid为表的关键字段,取按CID降序排序后的第9981-9999条记录,t_xiaoxi表有70000多条记录
个人感觉1的效率最好,3次之,2最差
相关文章
- 《潜行者2:切尔诺贝利之心》钻石外骨骼获得方法介绍 11-26
- 《潜行者2:切尔诺贝利之心》SSP100调查防护服获得方法介绍 11-26
- 《潜行者2:切尔诺贝利之心》旋风获取方法 11-26
- 《潜行者2:切尔诺贝利之心》小变异区特殊武器位置介绍 11-26
- 《潜行者2:切尔诺贝利之心》小变异区记者的贮藏点位置介绍 11-26
- 《潜行者2:切尔诺贝利之心》婚姻获取方法 11-26