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

2021-08-18 19:39:22 字數 2323 閱讀 9619

select top 頁大小 * 

from

(select row_number() over (order

by id) as rownumber,* from table1

) as a

where rownumber > 頁大小*(頁數-1)

--註解:首先利用row_number()為table1表的每一行新增乙個行號,給行號這一列取名'rownumber' 在over()方法中將'rownumber'做了公升序排列

--然後將'rownumber'列 與table1表的所有列 形成乙個表a

--重點在where條件。假如當前頁(currentpage)是第2頁,每頁顯示10個資料(pageszie)。那麼第一頁的資料就是第11-20條

--所以為了顯示第二頁的資料,即顯示第11-20條資料,那麼就讓rownumber大於 10*(2-1) 即:頁大小*(當前頁-1)

將上面的方法寫成儲存過程 (表名location)

if(exists(select* from sys.procedures where name='p_location_paging'))--如果p_location_paging這個儲存過程存在

drop proc p_location_paging --那麼就刪除這個儲存過程

gocreate proc p_location_paging(@pagesize int, @currentpage int)--建立儲存過程,定義兩個變數'每頁顯示的條數'和'當前頁'

2. 第二種方法:效率次之

select top 頁大小 *  --如果每頁顯示10條資料,那麼這裡就是查詢10條資料

from table1

where id > --假如當前頁為第三頁,那麼就需要查詢21-30條資料,即:id>20

(select isnull(max(id),0) --查詢子查詢中最大的id

from

(select top 頁大小*(當前頁-1) id from table1 order

by id --因為當前頁是第三頁,每頁顯示十條資料。那麼我將: 頁大小*(當前頁-1),就是獲取到了在"當前頁""前面"的20條資料。所以上面用max(id)查詢最大的id,取到這個20,那麼前面的where 條件的id>20 即取到了第三頁的資料,即取21-30條資料

) as a

)order

by id

將上面的方法寫成儲存過程:表名location

if(exists(select * from sys.procedures where name='p_location_paging'))

drop proc p_location_paging

gocreate proc p_location_paging(@pagesize int ,@currentpage int)

asselect top (@pagesize) * from location

where locid>(select isnull(max(locid),0)

from (select top ((@pagesize)*(@currentpage-1))locid from location order

by locid) as a

)order

by locid

3.第三種方法:效果最差

select top 頁大小 *

from table1

where id not

in --where條件語句限定要查詢的資料不是子查詢裡面包含的資料。即查詢"子查詢"後面的10條資料。即當前頁的資料

(--如果當前頁是第二頁,每頁顯示10條資料,那麼這裡就是獲取當前頁前面的所有資料。

select top 頁大小*(當前頁-1) id from table1 order

by id

)order

by id

百萬條資料分頁

寫出 之前,先說明一下原理,比較簡單。有一張表 test 如下 結構是 id 自動編號 txt 假設40條記錄 現在要每頁顯示10條記錄,則每頁要顯示的資料應該是 第一頁 10 第二頁 11 20 第三頁 21 30 第四頁 31 40 如要顯示第一頁,最簡單的方法就是 select top 10 ...

百萬條資料如何進行分頁查詢

今天面試被問到一張表 有500w條資料,如何進行分頁查詢,瞬間不知道怎麼回答,平時工作中沒接觸到這麼大的資料量。所以回家自己去實驗一下 建立一張user表 create table user id bigint 20 not null auto increment,username varchar ...

資料庫 利用Sql快速 高效的生成百萬條資料

執行以下sql即可生成100條資料 create table mytesttable as select rownum as id,to char sysdate rownum 24 3600 yyyy mm dd hh24 mi ss as inc datetime,trunc dbms rand...