Oralce 分頁 三種實現

迎著太陽走向遠方發表於2017-03-27
1.分頁的三種實現 速度最快  1 > 2 > 3
1.第一種採用rowid   4層
2.第二種是用 rownum分頁 3 層 (oracle規定:每次查詢中 rownum只能用一次)
3.第三種是 採用分析函式來實現

2.先介紹常用的rownum
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分頁(如果查詢裡面有 排序了,在最外面也要排序)
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.採用分析函式
 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快)
rowid 確定了每條記錄在oracle中的那一個資料物件,那個資料檔案,塊,行上。相當於直接在磁碟上讀取資料.rownum 相對於是一個對映值,還需要根據這個對映值去到磁碟上找。
rowid的格式如下: (有人說根據每個段的大小可以算出每個物理檔案的大小。)

資料物件編號 檔案編號 塊編號行編號
OOOOOO FFF BBBBBBRRR
data_object_id# rfile# block# row#
32bit 12bit 22bit 16bit

相關文章