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万条记录的情况下觉不出来。