关于asp.net应用程序存储过程做高效分页
众所周知用存储过程能实现高效的分页,但这个存储过程分页是不是只能局限在SQL数据库上,一旦用户用的不是SQL数据库而是MySQL或者其他,是否就会失效?是否要针对每一个数...
众所周知用存储过程能实现高效的分页,但这个存储过程分页是不是只能局限在SQL数据库上,一旦用户用的不是SQL数据库而是MySQL或者其他,是否就会失效?是否要针对每一个数据库写一个存储过程作为分页?那在效率上貌似有点差啊,比较繁琐,比如我用jQuery写分页是否就能通用?
展开
2013-07-18
展开全部
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://hi.baidu.com/xxu88/blog/item/462495356d5c801090ef39ad.html
方案一:(利用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://hi.baidu.com/xxu88/blog/item/462495356d5c801090ef39ad.html
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-07-18
展开全部
根据三层架构的思想个人觉得应该是要 分开写的的吧。 纯粹是个人观点,楼主不要收到我误导了,呵呵
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询