幾種分頁方法效率比較


ASP.net 的DataGrid 控件的內置分頁功能一直不被看好,原因是它先把所有數據從數據庫讀出來再進行分頁。在數據量很大的情況下,用它內置的分頁功能被認為幾乎是不可能的事。對海量數據的讀取和分頁,大家會通過自定義分頁來實現。其核心技術是SQL語句的設計。一般有三種方案:

方案一:(利用SQL的游標存儲過程分頁)
create procedure XiaoZhengGe
@sqlstr nvarchar(4000), --查詢字符串
@currentpage int, --第N頁
@pagesize int --每頁行數
as
set nocount on
declare @P1 int, --P1是游標的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 總頁數--,@rowcount as 總行數,@currentpage as 當前頁 
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize 
exec sp_cursorclose @P1
set nocount off
-------------------------------------
方案二:(利用SELECT TOP和Not In分頁)
SELECT TOP 頁大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 頁大小*頁數 id
FROM 表
ORDER BY id))
ORDER BY ID
-------------------------------------
分頁方案三:(利用SELECT TOP和ID>MAX(id)分頁)
SELECT TOP 頁大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 頁大小*頁數 id
FROM 表
ORDER BY id) AS T))
ORDER BY ID

有網友通過SQL 查詢分析器進行比較,得出結論:
方案三(利用ID>MAX(id))效率最高;
方案二(利用Not In) 效率次之;
方案一(利用SQL的游標存儲過程分頁)最為通用,但效率最差。

事實果真是這樣嗎?這三種方案就是比DataGrid 控件的內置分頁功能好嗎?我以前用Access做程序時發現Not in語句效率很低的呀?於是決定親自試一試。

裝SQL有點麻煩,就用 Access 吧,方案一用存儲過程分頁沒有試驗。

用Access新建一Book.mdb文件,打開后建一表mytable,加入五個字段:ID,name,author,islend,username。建好表后向內灌入一定數量的記錄,以方案二、方案三和DataGrid 控件的內置分頁功能分別寫一個 .aspx 文件,同時寫一 .asp 文件進行比較。

測試條件:P4 2.4G,256MDDR,WindowsXP,IIS,每頁20條記錄。
ID>MAX(id)語句:string sqlstr="Select Top "+PageSize+" * from mytable where(ID >(select MAX(ID) from(select top "+(PageSize*CurrentPage)+" ID from mytable order by ID asc))) order by ID asc";
Not In語句:string sqlstr="Select Top "+PageSize+" * from mytable where ID not in(select top "+(PageSize*CurrentPage)+" ID from mytable order by ID asc) order by ID asc";

運行結果如下:

方案 記錄條數及換頁時間
100萬 276000 10萬 1000
ID>MAX(ID) 16秒 3秒 1秒 <1秒
not in 未打開網頁 未打開網頁 未打開網頁 >1秒
DataGrid內置分頁 未打開網頁 23秒 5秒 <1秒
asp分頁 未打開網頁 3秒 1秒 <1秒


通過比較可見,DataGrid 控件的內置分頁功能的確不怎么樣,但比起一直比較流行的 Not in 語句分頁是好多了,至少在20多萬條記錄的情況下能顯示網頁。 有人說asp.net 因為是編譯執行,運行速度上比asp要快。通過測試沒發現快多少。
另:據說 DataList 控件比 DataGrid 控件數據顯示性能方面要好一些,可能是真的。我對這兩個控件也分別進行了測試,沒感覺有多大差異,至少在27萬條記錄的情況下覺不出來。
難道想象和現實之間的差距真的這么大嗎?
原文地址:http://blog.csdn.net/forevercyan/article/details/7475568

本站注釋:以上內容轉載。但以上max方法分頁有一個小弊端,始終無法查詢第一頁。當頁數為1的時候查的是第二頁,也頁數為0的時候查詢空白。網上很多方法說利用存儲過程實現進行判斷是否是第一頁,如果是就分別使用不同的max查詢語句。還有的說是使用編程語言判斷,執行不同的Sql分頁語句。其實不必如此,一句就可以搞定。無論是直接利用SQL還是加上存儲過程。
代碼如下:
select top pagesize * from tablename where id>=(select max(id) from (select top ((pageindex-1)*pagesize+1) id from tablename order by id ) as t) order by id


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM