Asp.net 幾種分頁方法效率比較

Asp.net 幾種分頁方法效率比較

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萬條記錄的情況下覺不出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章