分页是在做b/s开发当中比较常见的。SQL 2005 当中有了ROW_NUMBER 函数,使分页变的异常简单。同时它自动进行了优化相比较其他几种方法,速度是比较快的。
分页大体需要3个参数 pagesize(每页显示多少)pagenum(页数) pagecount(总记录数)。
分页SQL 2000可以用临时表 ,top 语句 ,游标 等等都可以实现。我们可以测试下
只写出临时表的
测试表如下 主键ID name 测试数据10w
create table sample
( id int identity primary key,
name varchar(8) not null
)
declare @n int ,@t datetime
set @n=1
set @t=getdate()
begin
insert into sample(name)
select 'a'+cast(@n as varchar)
set @n=@n+1
end
select datediff(ms,@t,getdate())
本文@pagesize都是从0开始的表示第一页
临时表如下实现分页存储过程如下::
create proc [dbo].[pages]
(
@pagesize int ,
@pagenum int ,
@pagecount int output
)
as
dbcc dropcleanbuffers --从缓存中清除数据
dbcc freeproccache--清空执行计划
declare @t datetime
set @t=getdate()
declare @table table(tID int identity,SID int)
insert into @table (SID)
select id from sample
select @pagecount=count(*) from @table
select a.* from
sample a,@table b
where a.id=b.sid and tid>@pagesize*@pagenum and tid<=(@pagesize+1)*@pagenum
select datediff(ms,@t,getdate())
测试数据为 @pagesize=2 @pagenum=20 总记录数为10w 大体时间为900ms左右 ,不同的电脑数据会有差别,但跟用row_number() 比较还是明显比较大的。
row_number() 实现分页存储过程如下:
create proc [dbo].[pages_1]
(
@pagesize int ,
@pagenum int ,
@pagecount int output
)
as
dbcc dropcleanbuffers --从缓存中清除数据
dbcc freeproccache--清空执行计划
declare @t datetime
set @t=getdate()
with temp as(
select * ,row_number() over(order by id)as num
from sample
)
select @pagecount= count(*) from temp;
with temp as(
select * ,row_number() over(order by id)as num
from sample
)
select * from temp
where num between @pagesize*@pagenum+1 and (@pagesize+1)*@pagenum;
select datediff(ms,@t,getdate())
测试数据为 @pagesize=2 @pagenum=20 总记录数为10w 大体时间为200ms左右 区别还是比较大的 比上面一种快5倍。