SQL Server 分页

今天做网站时,用到了分页,虽然.NET本身有分页的控件,然而效率不敢恭维;于是就用SQLSERVER数据库的存储过程来实现分页,总结了以下四种方案并进行比较,供朋友们参考,少走弯路啊,呵呵。
方案一(利用ID大于多少和SELECT TOP分页)
语句形式(SQLSERVER 2000):
CREATE procedure cfems_getinfolist(@pageindex int,@pagesize int)
as
declare @sqlstr varchar(1000)
set @sqlstr='select top '+cast(@pagesize as varchar)+'* from count_main where id>='+
'(select max(id) from (select top '+cast(1+@pagesize*(@pageindex-1) as varchar)+' id '+
'from count_main order by id) AS T) order by id'
begin 
exec (@sqlstr)
end;
GO
 
语句形式(SQLSERVER 2005):
CREATE procedure cfems_getinfolist(@pageindex int,@pagesize int)
as
BEGIN
select top @pagesize * from count_main
where id>=(select max(id) from (select top 1+@pagesize*(@pageindex-1) id
from count_main order by id) AS T) order by id
end;
GO
 
方案二(利用Not In和SELECT TOP分页)
语句形式:
SELECT TOP 10 *
 FROM TestTable
 WHERE (ID NOT IN
           (SELECT TOP 20 id
          FROM TestTable
          ORDER BY id))
 ORDER BY ID
 
 SELECT TOP 页大小 *
 FROM TestTable
 WHERE (ID NOT IN
           (SELECT TOP 页大小*页数 id
          FROM 表
          ORDER BY id))
 ORDER BY ID

  
方案三(使用类似oracle的rownum功能来实现分页)
create procedure cfems_test(@pageindex int,@pagesize int)
as
begin
select identity(int,1,1) rownum,*
into test
from (select   top   100   percent   *   from   count_main) T;

select *
from test
where rownum>(@pageindex-1)*@pagesize and rownum<=@pageindex*@pagesize
drop table test;
end;

 

 

方案四(利用SQL的游标存储过程分页)

create  procedure SqlPager
 @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

 

通过SQL 查询分析器,显示比较:我的结论是:
 分页方案一、二:效率都比较高,40多万的数据量查询最后几页2秒钟就可以出来,尤其推荐方案一;

 分页方案三、四:效率最差,不建议使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值