分页实现方法的性能比较
|
源代码网整理以下我们先给出几种主要的分页方法和核心语句,然后直接给出结论,有兴趣的读者可以看看后面的数据 源代码网整理以下几种常用存储过程分页方法 源代码网整理以下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 源代码网整理以下 源代码网整理以下with cte_temp--定义零时表,PageIndex是一个计算字段,储存了搜索结果的页号 源代码网整理以下 As (ceiling((Row_Number() over(order by .... )-1)/@pagesize as int) as PageIndex,* from TableName where.....) 源代码网整理以下 源代码网整理以下结论: 源代码网整理以下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就是上面的方法,CTE改进只是把选入CTE临时表的列数减少了,只选取了页号和主键,Null表示时间无法计算(时间太长),数据单位是毫秒. 源代码网整理以下从上面的数据可以看到,TopN在前32页都是有优势的,但是页数增大后,性能降低很快,CTE改进比CTE有所进步,平均进步两秒左右,但是还是比临时表慢,但是考虑临时表会增大日志文件的大小,引起大量IO,CTE也就有他自己的优势,公司现在正在使用的存储过程效率不错,但是在页码靠后的情况下性能会降低 源代码网供稿. |
