几种分页方法效率比较

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

posted @ 2012-07-13 11:10  lhyterry  阅读(7443)  评论(1编辑  收藏  举报