分頁實現(xiàn)方法的性能比較
更新時間:2008年11月24日 20:47:17 作者:
我們先給出幾種主要的分頁方法和核心語句,然后直接給出結(jié)論,有興趣的讀者可以看看后面的數(shù)據(jù)
幾種常用存儲過程分頁方法
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是一個計算字段,儲存了搜索結(jié)果的頁號
As (ceiling((Row_Number() over(order by .... )-1)/@pagesize as int) as PageIndex,* from TableName where.....)
select * from cte_temp where pageindex=@pageindex-1;
結(jié)論:
TopN在小頁數(shù)下最快,如果在10頁以下,可以考慮用它,CTE和臨時表時間很穩(wěn)定,CTE消耗的時間比臨時表多,但是不會引起tempdb的暴漲和IO增加
性能比較
試驗環(huán)境:win2003server,Sqlserver2005,庫大小2,567,245行,沒有where子句,試驗時每頁大小50,頁碼作為變量
取0,3,10,31,100,316,1000,3162...頁,也就是10的指數(shù),試驗結(jié)果如下
頁數(shù) 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 Null 9806 869 2578 635 8948
3162 Null 9822 2485 4110 12460 8210
10000 Null 9754 7812 11926 14250 7359
31623 Null 9775 18729 33218 15249 7511
100000 Null Null 31538 55569 17139 6124
數(shù)據(jù)解釋和分析
臨時表分為有沒有緩存兩種時間,CTE就是上面的方法,CTE改進只是把選入CTE臨時表的列數(shù)減少了,只選取了頁號和主鍵,Null表示時間無法計算(時間太長),數(shù)據(jù)單位是毫秒.
從上面的數(shù)據(jù)可以看到,TopN在前32頁都是有優(yōu)勢的,但是頁數(shù)增大后,性能降低很快,CTE改進比CTE有所進步,平均進步兩秒左右,但是還是比臨時表慢,但是考慮臨時表會增大日志文件的大小,引起大量IO,CTE也就有他自己的優(yōu)勢,公司現(xiàn)在正在使用的存儲過程效率不錯,但是在頁碼靠后的情況下性能會降低
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 ...
臨時表
復(fù)制代碼 代碼如下:
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是一個計算字段,儲存了搜索結(jié)果的頁號
As (ceiling((Row_Number() over(order by .... )-1)/@pagesize as int) as PageIndex,* from TableName where.....)
select * from cte_temp where pageindex=@pageindex-1;
結(jié)論:
TopN在小頁數(shù)下最快,如果在10頁以下,可以考慮用它,CTE和臨時表時間很穩(wěn)定,CTE消耗的時間比臨時表多,但是不會引起tempdb的暴漲和IO增加
性能比較
試驗環(huán)境:win2003server,Sqlserver2005,庫大小2,567,245行,沒有where子句,試驗時每頁大小50,頁碼作為變量
取0,3,10,31,100,316,1000,3162...頁,也就是10的指數(shù),試驗結(jié)果如下
頁數(shù) 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 Null 9806 869 2578 635 8948
3162 Null 9822 2485 4110 12460 8210
10000 Null 9754 7812 11926 14250 7359
31623 Null 9775 18729 33218 15249 7511
100000 Null Null 31538 55569 17139 6124
數(shù)據(jù)解釋和分析
臨時表分為有沒有緩存兩種時間,CTE就是上面的方法,CTE改進只是把選入CTE臨時表的列數(shù)減少了,只選取了頁號和主鍵,Null表示時間無法計算(時間太長),數(shù)據(jù)單位是毫秒.
從上面的數(shù)據(jù)可以看到,TopN在前32頁都是有優(yōu)勢的,但是頁數(shù)增大后,性能降低很快,CTE改進比CTE有所進步,平均進步兩秒左右,但是還是比臨時表慢,但是考慮臨時表會增大日志文件的大小,引起大量IO,CTE也就有他自己的優(yōu)勢,公司現(xiàn)在正在使用的存儲過程效率不錯,但是在頁碼靠后的情況下性能會降低
相關(guān)文章
asp IsValidEmail 驗證郵箱地址函數(shù)(email)
驗證郵箱很多在js客戶端驗證了,但是那樣很容易被人破了,我們在服務(wù)器上用asp進行驗證的話就應(yīng)該沒有問題了。2010-05-05[ASP]RegExp對象提供簡單的正則表達式支持功能使用說明
[ASP]RegExp對象提供簡單的正則表達式支持功能使用說明...2007-07-07asp 取一個數(shù)的整數(shù) 但不是四舍五入,只要有小數(shù),就取大于這個數(shù)的整數(shù)
asp 取一個數(shù)的整數(shù) 但不是四舍五入,只要有小數(shù),就取大于這個數(shù)的整數(shù)2009-10-10asp下返回以千分位顯示數(shù)字格式化的數(shù)值
asp下返回以千分位顯示數(shù)字格式化的數(shù)值...2007-08-08