在專案中,我們經常遇到或用到分頁,那麼在大資料量(百萬級以上)下,哪種分頁演算法效率最優呢?我們不妨用事實說話。
測試環境
硬體:cpu 酷睿雙核t5750 記憶體:2g
軟體:windows server 2003 + sql server 2005
ok,我們首先建立一資料庫:data_test,並在此資料庫中建立一表:tb_testtable
然後我們在資料表中插入2000000條資料:
我首先寫了五個常用儲存過程:
1,利用select top 和select not in進行分頁,具體**如下:
2,利用select top 和 select max(列鍵)
3,利用select top和中間變數--此方法因網上有人說效果最佳,所以貼出來一同測試
4,利用row_number() 此方法為sql server 2005中新的方法,利用row_number()給資料行加上索引
5,利用臨時表及row_number
ok,至此,儲存過程建立完畢,我們分別在每頁10條資料的情況下在第2頁,第1000頁,第10000頁,第100000頁,第199999頁進行測試,耗時單位:ms 每頁測試5次取其平均值
存過第2頁耗時
第1000頁耗時
第10000頁耗時
第100000頁耗時
第199999頁耗時
效率排行
1用not in
0ms16ms
47ms
475ms
953ms
32用select max
5ms16ms
35ms
325ms
623ms
13中間變數
966ms
970ms
960ms
945ms
933ms
54row_number
0ms0ms
34ms
365ms
710ms
24臨時表
780ms
796ms
798ms
780ms
805ms4
測試結果顯示:select max >row_number>not in>臨時表》中間變數
於是我對效率最高的select max方法用2分法進行了擴充套件,**取自網際網路,我修改了asc排序時取不到值的bug,測試結果:
2分法156ms
156ms
180ms
470ms
156ms1*
從測試結果來看,使用2分法確實可以提高效率並使效率更為穩定,我又增加了第159999頁的測試,用時僅296ms,效果相當的不錯!
下面是2分法使用select max的**,已相當完善。
執行示例:exec proc_paged_2part_selectmax 'tb_testtable','id,username,userpwd,useremail',10,100000,'id',0,null,'id',0
這種測試只在單機進行,並且沒有在實際開發web專案中分頁測試,測試項也比較單一,所以不夠全面系統,但從其效率相比上,我們可以在資料庫分頁演算法上進行有效的控制。
分頁儲存過程 分頁儲存過程
分頁儲存過程 alter proc dbo p pageshow pagesize int,每頁大小 currentpage int out,當前頁 housename nvarchar 50 房產名稱 totalcount int out,總記錄數 totalpage int out 總頁數 as...
分頁儲存過程
create proc p sobigo percentpage tblname varchar 255 t category 表名 strgetfields varchar 1000 需要返回的列 fldname varchar 255 排序的欄位名 pagesize int 10,頁尺寸 pag...
分頁儲存過程
create procedure pro select pageindex int,pagesize int as select student.sno,student.sname,student.s grade.math,grade.physics,grade.huaxue,grade.chine...