Asp.net 幾種分頁方法效率比較
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分頁)
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 頁大小*頁數 id
FROM 表
ORDER BY id))
ORDER BY ID
-------------------------------------
分頁方案三:(利用SELECT TOP和ID>MAX(id)分頁)
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 頁大小*頁數 id
FROM 表
ORDER BY id) AS T))
ORDER BY ID
有網友通過SQL 查詢分析器進行比較,得出結論:
方案二(利用Not In) 效率次之;
方案一(利用SQL的遊標存儲過程分頁)最爲通用,但效率最差。
裝SQL有點麻煩,就用 Access 吧,方案一用存儲過程分頁沒有試驗。
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";
運行結果如下:
方案 | 記錄條數及換頁時間 | |||
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萬條記錄的情況下覺不出來。