高效分頁的SQL技巧 以Oracle為例

2021-09-05 03:42:51 字數 821 閱讀 6552

一般的分頁寫法大概就是下面的樣子(所謂的「三層巢狀」寫法),

select *  

from   (select a.*  

,rownum rn  

from   (select * from table_name) a  

where  rownum <= 40)  

where  rn >= 21 

在遇到顯示資料表中1百萬行以後的記錄時,可能會出現效能問題。有人提出的解決方案是利用索引,首先通過掃瞄索引查出rowid,然後再通過rowid查出所需記錄。這樣做的問題是如果沒有索引怎麼辦?以oracle為例,下面是乙個更具有一般意義的高效寫法:

select *  

from

table

name> t  

where  rowid in (select rwd  

from   (select t.rowid rwd  

,rownum  n  

from

table

name> t  

where  rownum <= 1000000 + 10)  

where  n >= 1000000) 

優化的思想是跳到第1百萬位置時只是掃瞄了rowid,避免了掃瞄全部字段。當欄位個數較多時,速度會有十倍的提公升。本例在普通的裝置上執行不到1秒就出來結果了。這一方法在千萬級或億級仍然存在問題,其原因在於迴圈次數並未減少。如果真有rwd這樣乙個字段,那麼通過索引和分割槽等手段,也能夠確保速度。不過,話又說回來,分頁顯示成百上千萬條記錄這樣的事情,其欲達到的業務目的本身可否有更好的解決之道呢?

手寫分頁sql 請說說sql高效分頁??

網上已經有很多演算法了,我一直用顛顛倒倒法,是拼接sql的,相容多種資料庫,不喜歡用儲存過程。公式 select 顯示的字段 from 表名 檢視名 where 主鍵字段 in select top pagesize 主鍵字段 from select top 主鍵字段 排序字段 from 有幾個排序...

oracle 排序分頁 高效sql語句

最好還是利用分析函式row number over partition by col1 order by col2 比如想取出100 150條記錄,按照tname排序 select tname,tabtype from select tname,tabtype,row number over ord...

SQL高效分頁(百萬條資料)

select top 頁大小 from select row number over order by id as rownumber,from table1 as a where rownumber 頁大小 頁數 1 註解 首先利用row number 為table1表的每一行新增乙個行號,給行號...