日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
SQL Server分頁(yè)存儲(chǔ)過(guò)程的五種方法及性能比較

SQL Server數(shù)據(jù)庫(kù)操作中,我們常常會(huì)用到存儲(chǔ)過(guò)程對(duì)實(shí)現(xiàn)對(duì)查詢的數(shù)據(jù)的分頁(yè)處理,以方便瀏覽者的瀏覽。本文我們總結(jié)了五種SQL Server分頁(yè)存儲(chǔ)過(guò)程的方法,并對(duì)其性能進(jìn)行了比較,接下來(lái)就讓我們來(lái)一起了解一下這一過(guò)程。

創(chuàng)建數(shù)據(jù)庫(kù)data_Test :

 
 
 
  1. create database data_Test    
  2.  
  3. GO    
  4.  
  5. use data_Test    
  6.  
  7. GO    
  8.  
  9. create table tb_TestTable   --創(chuàng)建表    
  10.  
  11. (    
  12.  
  13. id int identity(1,1) primary key,    
  14.  
  15. userName nvarchar(20) not null,    
  16.  
  17. userPWD nvarchar(20) not null,    
  18.  
  19. userEmail nvarchar(40) null   
  20.  
  21. )    
  22.  
  23. GO 

插入數(shù)據(jù):

 
 
 
  1. set identity_insert tb_TestTable on    
  2.  
  3. declare @count int   
  4.  
  5. set@count=1    
  6.  
  7. while @count<=2000000    
  8.  
  9. begin    
  10.  
  11. insert into tb_TestTable(id,userName,userPWD,userEmail) values(@count,'admin','admin888','lli0077@yahoo.com.cn')    
  12.  
  13. set @count=@count+1    
  14.  
  15. end    
  16.  
  17. set identity_insert tb_TestTable off 

1、利用select top 和select not in進(jìn)行分頁(yè)

具體代碼如下:

 
 
 
  1. create procedure proc_paged_with_notin  --利用select top and select not in   
  2.  
  3. (    
  4.  
  5. @pageIndex int,  --頁(yè)索引    
  6.  
  7. @pageSize int    --每頁(yè)記錄數(shù)    
  8.  
  9. )    
  10.  
  11. as   
  12.  
  13. begin    
  14.  
  15. set nocount on;    
  16.  
  17. declare @timediff datetime --耗時(shí)    
  18.  
  19. declare @sql nvarchar(500)    
  20.  
  21. select @timediff=Getdate()    
  22.  
  23. set @sql='select top '+str(@pageSize)+' * from tb_TestTable where(ID not in(select top '+str(@pageSize*@pageIndex)+' id from tb_TestTable order by ID ASC)) order by ID'   
  24.  
  25. execute(@sql)  --因select top后不支技直接接參數(shù),所以寫成了字符串@sql    
  26.  
  27. select datediff(ms,@timediff,GetDate()) as 耗時(shí)    
  28.  
  29. set nocount off;    
  30.  
  31. end 

2、利用select top 和 select max(列鍵)

 
 
 
  1. create procedure proc_paged_with_selectMax  --利用select top and select max(列)    
  2.  
  3. (    
  4.  
  5. @pageIndex int,  --頁(yè)索引    
  6.  
  7. @pageSize int    --頁(yè)記錄數(shù)    
  8.  
  9. )    
  10.  
  11. as   
  12.  
  13. begin    
  14.  
  15. set nocount on;    
  16.  
  17. declare @timediff datetime    
  18.  
  19. declare @sql nvarchar(500)    
  20.  
  21. select @timediff=Getdate()    
  22.  
  23. set @sql='select top '+str(@pageSize)+' * From tb_TestTable where(ID>(select max(id) From (select top '+str(@pageSize*@pageIndex)+' id From tb_TestTable order by ID) as TempTable)) order by ID'   
  24.  
  25. execute(@sql)    
  26.  
  27. select datediff(ms,@timediff,GetDate()) as 耗時(shí)    
  28.  
  29. set nocount off;    
  30.  
  31. end 

3、利用select top和中間變量

 
 
 
  1. create procedure proc_paged_with_Midvar  --利用ID>最大ID值和中間變量    
  2.  
  3. (    
  4.  
  5. @pageIndex int,    
  6.  
  7. @pageSize int   
  8.  
  9. )    
  10.  
  11. as   
  12.  
  13. declare @count int   
  14.  
  15. declare @ID int   
  16.  
  17. declare @timediff datetime    
  18.  
  19. declare @sql nvarchar(500)    
  20.  
  21. begin    
  22.  
  23. set nocount on;    
  24.  
  25. select @count=0,@ID=0,@timediff=getdate()    
  26.  
  27. select @count=@count+1,@ID=case when @count<=@pageSize*@pageIndex then ID else @ID end from tb_testTable order by id    
  28.  
  29. set @sql='select top '+str(@pageSize)+' * from tb_testTable where ID>'+str(@ID)    
  30.  
  31. execute(@sql)    
  32.  
  33. select datediff(ms,@timediff,getdate()) as 耗時(shí)    
  34.  
  35. set nocount off;    
  36.  
  37. end 

4、利用Row_number() 此方法為SQL server 2005中新的方法,利用Row_number()給數(shù)據(jù)行加上索引

 
 
 
  1. create procedure proc_paged_with_Rownumber  --利用SQL 2005中的Row_number()    
  2.  
  3. (    
  4.  
  5. @pageIndex int,    
  6.  
  7. @pageSize int   
  8.  
  9. )    
  10.  
  11. as   
  12.  
  13. declare @timediff datetime    
  14.  
  15. begin    
  16.  
  17. set nocount on;    
  18.  
  19. select @timediff=getdate()    
  20.  
  21. select * from (select *,Row_number() over(order by ID asc) as IDRank from tb_testTable) as IDWithRowNumber where IDRank>@pageSize*@pageIndex and IDRank<@pageSize*(@pageIndex+1)    
  22.  
  23. select datediff(ms,@timediff,getdate()) as 耗時(shí)    
  24.  
  25. set nocount off;    
  26.  
  27. end  

5、利用臨時(shí)表及Row_number

 
 
 
  1. create procedure proc_CTE  --利用臨時(shí)表及Row_number    
  2.  
  3. (    
  4.  
  5. @pageIndex int,  --頁(yè)索引    
  6.  
  7. @pageSize int    --頁(yè)記錄數(shù)    
  8.  
  9. )    
  10.  
  11. as   
  12.  
  13. set nocount on;    
  14.  
  15. declare @ctestr nvarchar(400)    
  16.  
  17. declare @strSql nvarchar(400)    
  18.  
  19. declare @datediff datetime    
  20.  
  21. begin    
  22.  
  23. select @datediff=GetDate()    
  24.  
  25. set @ctestr='with Table_CTE as   
  26.  
  27. (select ceiling((Row_number() over(order by ID ASC))/'+str(@pageSize)+') as page_num,* from tb_TestTable)';    
  28.  
  29. set @strSql=@ctestr+' select * From Table_CTE where page_num='+str(@pageIndex)    
  30.  
  31. end    
  32.  
  33. begin    
  34.  
  35. execute sp_executesql @strSql    
  36.  
  37. select datediff(ms,@datediff,GetDate())    
  38.  
  39. set nocount off;    
  40.  
  41. end 

以上的五種方法中,網(wǎng)上說(shuō)第三種利用select top和中間變量的方法是效率最高的。

關(guān)于SQL Server數(shù)據(jù)庫(kù)分頁(yè)的存儲(chǔ)過(guò)程的五種方法及性能比較的知識(shí)就介紹到這里了,如果您想了解更多SQL Server數(shù)據(jù)庫(kù)的知識(shí)可以看一下這里的文章:http://database./sqlserver/,相信一定可以帶給您收獲的!

【編輯推薦】

  1. 存儲(chǔ)過(guò)程的優(yōu)缺點(diǎn)及適宜使用的場(chǎng)合詳解
  2. 使用connectionStrings連接SQL Server數(shù)據(jù)庫(kù)
  3. 操作系統(tǒng)不支持SQL Server服務(wù)器組件的解決方案
  4. SQL Server數(shù)據(jù)庫(kù)使用DBCC ShowContig檢查索引碎片
  5. 一個(gè)SQL Server 2005數(shù)據(jù)庫(kù)用戶sa登錄失敗的解決方案

網(wǎng)頁(yè)名稱:SQL Server分頁(yè)存儲(chǔ)過(guò)程的五種方法及性能比較
網(wǎng)站路徑:http://www.5511xx.com/article/cohdioe.html