Oralce 分页 三种实现 .

本文对比了Oracle数据库中三种分页技术的速度与适用场景:rowid分页、rownum分页及分析函数分页。rowid分页因直接定位磁盘数据而速度最快,但不支持与GROUP BY一同使用;rownum分页次之,受限于单次查询中rownum仅能使用一次的规定;分析函数分页虽灵活但在大数据量下性能不佳。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.分页的三种实现 速度最快  1 > 2 > 3 
Java代码 
  1. 1.第一种采用rowid   4层  
  2. 2.第二种是用 rownum分页 3 层 (oracle规定:每次查询中 rownum只能用一次)  
  3. 3.第三种是 采用分析函数来实现  

2.先介绍常用的rownum 
Java代码 
  1. select * from (select row_.*,rownum rn from (select empno,ename,sal from scott.emp where sal>800 order by sal ) row_ where rownum<11)  where rn>5;  

3.使用 rowid分页(如果查询里面有 排序了,在最外面也要排序) 
Java代码 
  1. select * from emp where rowid in (select rid from (select rownum rn,rid from (select rowid rid,sal from emp where sal>800 order by sal) where rownum<11) where rn>5) order by sal; //发现不能和group by 使用,有人说是oracle的bug。所以 一般人都用 rownum分组  

4.采用分析函数 
Java代码 
  1. select * from (select e.*,row_number() over(order by sal) rk from emp e where e.sal>800) where  rk<11 and rk>5 // 这个 在数据量比较多的时候 速度严重下降,所以一般人也不选这个.  

5.介绍下rowid(为什么rowid比rownum快) 
Java代码 
  1. rowid 确定了每条记录在oracle中的那一个数据对象,那个数据文件,块,行上。相当于直接在磁盘上读取数据.rownum 相对于是一个映射值,还需要根据这个映射值去到磁盘上找。  
  2. rowid的格式如下: (有人说根据每个段的大小可以算出每个物理文件的大小。)  

数据对象编号 文件编号 块编号 行编号
OOOOOO FFF BBBBBB RRR
data_object_id# rfile# block# row#
32bit 12bit 22bit 16bit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值