1.分页的三种实现 速度最快 1 > 2 > 3
2.先介绍常用的rownum
3.使用 rowid分页(如果查询里面有 排序了,在最外面也要排序)
4.采用分析函数
5.介绍下rowid(为什么rowid比rownum快)
- 1.第一种采用rowid4层
- 2.第二种是用rownum分页3层(oracle规定:每次查询中rownum只能用一次)
- 3.第三种是采用分析函数来实现
2.先介绍常用的rownum
- select*from(selectrow_.*,rownumrnfrom(selectempno,ename,salfromscott.empwheresal>800orderbysal)row_whererownum<11)wherern>5;
3.使用 rowid分页(如果查询里面有 排序了,在最外面也要排序)
- select*fromempwhererowidin(selectridfrom(selectrownumrn,ridfrom(selectrowidrid,salfromempwheresal>800orderbysal)whererownum<11)wherern>5)orderbysal;//发现不能和groupby使用,有人说是oracle的bug。所以一般人都用rownum分组
4.采用分析函数
- select*from(selecte.*,row_number()over(orderbysal)rkfromempewheree.sal>800)whererk<11andrk>5//这个在数据量比较多的时候速度严重下降,所以一般人也不选这个.
5.介绍下rowid(为什么rowid比rownum快)
- rowid确定了每条记录在oracle中的那一个数据对象,那个数据文件,块,行上。相当于直接在磁盘上读取数据.rownum相对于是一个映射值,还需要根据这个映射值去到磁盘上找。
- rowid的格式如下:(有人说根据每个段的大小可以算出每个物理文件的大小。)
数据对象编号 | 文件编号 | 块编号 | 行编号 |
OOOOOO | FFF | BBBBBB | RRR |
data_object_id# | rfile# | block# | row# |
32bit | 12bit | 22bit | 16bit |