分页那回事

 

分页是在做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()

while @n<=100000

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倍。

posted @ 2010-05-18 21:00  清水无大大鱼  阅读(265)  评论(0编辑  收藏  举报