分页实现方法的性能比较

原创 2007年09月27日 16:33:00

我们先给出几种主要的分页方法和核心语句,然后直接给出结论,有兴趣的读者可以看看后面的数据

几种常用存储过程分页方法

TopN方法

select Top(@PageSize) from TableName where ID Not IN  

(Select Top ((@PageIndex-1)*@PageSize)  ID from Table Name where .... order by ... )

where .... order by ...

临时表

declare @indextable table(id int identity(1,1),nid int,PostUserName nvarchar(50))

declare @PageLowerBound int

declare @PageUpperBound int

set @PageLowerBound=(@pageindex-1)*@pagesize--下限

set @PageUpperBound=@PageLowerBound+@pagesize--上限

set rowcount @PageUpperBound

insert into @indextable(nid,PostUserName) select ReplyID,PostUserName from  TableName order by ......

select *  from  TableName p,@indextable t where p.ID=t.nid

and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id

CTE--2005新语法,类似临时表,但是生命周期稍微不同,这里只是他的一个运用

with cte_temp--定义零时表,PageIndex是一个计算字段,储存了搜索结果的页号

 As (ceiling((Row_Number() over(order by .... )-1)/@pagesize as int) as PageIndex,* from TableName where.....)
select *  from cte_temp where pageindex=@pageindex-1;

结论:

TopN在小页数下最快,如果在10页以下,可以考虑用它,CTE和临时表时间很稳定,CTE消耗的时间比临时表多,但是不会引起tempdb的暴涨和IO增加

性能比较

试验环境:win2003server,Sqlserver2005,库大小2,567,245行,没有where子句,试验时每页大小50,页码作为变量

取0,3,10,31,100,316,1000,3162...页,也就是10的指数,试验结果如下

页数 TopN CTE 临时表 临时表 老论坛存储过程 CTE改进
1 3 12 10 101 457 7302
3 15 7 79 5524 464 7191
10 127 5504 88 3801 464 6116
32 588 9672 122 3601 976 7602
100 4680 9738 166 4235 486 7151
316 45271 9764 323 3867 522 7255
1000 无法计算 9806 869 2578 635 8948
3162 无法计算 9822 2485 4110 12460 8210
10000 无法计算 9754 7812 11926 14250 7359
31623 无法计算 9775 18729 33218 15249 7511
100000 无法计算 无法计算 31538 55569 17139 6124

数据解释和分析

临时表分为有没有缓存两种时间,CTE就是上面的方法,CTE改进只是把选入CTE临时表的列数减少了,只选取了页号和主键,Null表示时间无法计算(时间太长),数据单位是毫秒.

从上面的数据可以看到,TopN在前32页都是有优势的,但是页数增大后,性能降低很快,CTE改进比CTE有所进步,平均进步两秒左右,但是还是比临时表慢,但是考虑临时表会增大日志文件的大小,引起大量IO,CTE也就有他自己的优势,公司现在正在使用的存储过程效率不错,但是在页码靠后的情况下性能会降低

 

分页实现方法的性能比较

几种常用存储过程分页方法 TopN方法 select Top(@PageSize) from TableName where ID Not IN   (Select Top ((@PageIndex-...
  • jxufewbt
  • jxufewbt
  • 2007年07月04日 12:59
  • 719

分页实现方法的性能比较

我们先给出几种主要的分页方法和核心语句,然后直接给出结论,有兴趣的读者可以看看后面的数据几种常用存储过程分页方法TopN方法select Top(@PageSize) from TableName w...
  • yizhu2000
  • yizhu2000
  • 2007年06月03日 18:24
  • 5933

常用存储过程分页实现方法的性能比较

我们先给出几种主要的分页方法和核心语句,然后直接给出结论,有兴趣的读者可以看看后面的数据几种常用存储过程分页方法TopN方法select Top(@PageSize) from TableName w...
  • Monster_ll
  • Monster_ll
  • 2007年12月16日 02:22
  • 681

mysql和oracle分页实现方式

1,mysql实现分页的方式   limit start,count 如果数据量比较小,10w以下,直接简单的使用上面这张方式就行了。 如果数据量比较大,特别是100w以上的数据量,用上面那种方...
  • zfh320325
  • zfh320325
  • 2016年04月21日 11:01
  • 557

第五讲 分页的实现

一、分析mysql的分页语句:limit startIndex, pageSize      mapper映射文件:            select id="selec...
  • LJLVCXJ
  • LJLVCXJ
  • 2017年05月25日 21:38
  • 277

常见的分页的实现方式--简介

MySQL  :SELECT * FROM tablename LIMIT M,N;(M从哪里开始,N数据的条数) PostgreSQL: SELECT * FROM tablename LIMIT ...
  • echo_oy
  • echo_oy
  • 2016年08月16日 18:15
  • 694

三种分页的实现方式

三种分页的实现方式 (1)每次取查询结果的所有数据,然后根据页面显示指定的记录 (2)根据页面只取一页的数据,然后显示这一页,这里要构造sql语句 (3)取一定页数的数据,就是前两种的折中 ...
  • hephec
  • hephec
  • 2014年12月04日 20:17
  • 1853

SSH hibernate 分页的几种实现方式

转载请注明出处~!! 第一种: DetachedCriteria  Criteria 形式 @SuppressWarnings({ "unchecked", "rawtypes" }) p...
  • wuqilianga
  • wuqilianga
  • 2016年06月13日 11:58
  • 1540

公共的分页方法

公共的分页方法 1,DAO层方法 /** * 分页的接口方法 * * @param allSizeHql 查找所有记录条数的hql语句 * @param ...
  • hwt_211
  • hwt_211
  • 2013年09月26日 09:22
  • 805

实现了hibernate的简单的分页了。其实很简单(一)

今天终于实现了hibernate实现分页了。。把oksonic的SSH的例子做了增加,实现了查询的分页。同时现在也把srtuts + spring + hibernate  结合的实现方法重新复习了一...
  • xdy3008
  • xdy3008
  • 2006年08月10日 16:05
  • 1068
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分页实现方法的性能比较
举报原因:
原因补充:

(最多只允许输入30个字)