欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談基于SQL Server分頁存儲過程五種方法及性能比較

 更新時間:2015年09月24日 15:38:22   投稿:mrr  
本文由腳本之家小編給大家分享了五種sqlserver分頁存儲過程及性能比較,接下來我們跟著小編一起了解了解吧

在SQL Server數據庫操作中,我們常常會用到存儲過程對實現對查詢的數據的分頁處理,以方便瀏覽者的瀏覽。

創(chuàng)建數據庫data_Test :

create database data_Test  
GO  
use data_Test  
GO  
create table tb_TestTable  --創(chuàng)建表  
(  
id int identity(1,1) primary key,  
userName nvarchar(20) not null,  
userPWD nvarchar(20) not null,  
userEmail nvarchar(40) null  
)  
GO 

插入數據:

set identity_insert tb_TestTable on  
declare @count int  
set@count=1  
while @count<=2000000  
begin  
insert into tb_TestTable(id,userName,userPWD,userEmail) values(@count,'admin','admin888','lli0077@yahoo.com.cn')  
set @count=@count+1  
end  
set identity_insert tb_TestTable off 

1、利用select top 和select not in進行分頁

具體代碼如下:

create procedure proc_paged_with_notin --利用select top and select not in  
(  
@pageIndex int, --頁索引  
@pageSize int  --每頁記錄數  
)  
as  
begin  
set nocount on;  
declare @timediff datetime --耗時  
declare @sql nvarchar(500)  
select @timediff=Getdate()  
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'  
execute(@sql) --因select top后不支技直接接參數,所以寫成了字符串@sql  
select datediff(ms,@timediff,GetDate()) as 耗時  
set nocount off;  
end 

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

create procedure proc_paged_with_selectMax --利用select top and select max(列)  
(  
@pageIndex int, --頁索引  
@pageSize int  --頁記錄數  
)  
as  
begin  
set nocount on;  
declare @timediff datetime  
declare @sql nvarchar(500)  
select @timediff=Getdate()  
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'  
execute(@sql)  
select datediff(ms,@timediff,GetDate()) as 耗時  
set nocount off;  
end 

3、利用select top和中間變量

create procedure proc_paged_with_Midvar --利用ID>最大ID值和中間變量  
(  
@pageIndex int,  
@pageSize int  
)  
as  
declare @count int  
declare @ID int  
declare @timediff datetime  
declare @sql nvarchar(500)  
begin  
set nocount on;  
select @count=0,@ID=0,@timediff=getdate()  
select @count=@count+1,@ID=case when @count<=@pageSize*@pageIndex then ID else @ID end from tb_testTable order by id  
set @sql='select top '+str(@pageSize)+' * from tb_testTable where ID>'+str(@ID)  
execute(@sql)  
select datediff(ms,@timediff,getdate()) as 耗時  
set nocount off;  
end 

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

create procedure proc_paged_with_Rownumber --利用SQL 2005中的Row_number()  
(  
@pageIndex int,  
@pageSize int  
)  
as  
declare @timediff datetime  
begin  
set nocount on;  
select @timediff=getdate()  
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)  
select datediff(ms,@timediff,getdate()) as 耗時  
set nocount off;  
end

5、利用臨時表及Row_number

create procedure proc_CTE --利用臨時表及Row_number  
(  
@pageIndex int, --頁索引  
@pageSize int  --頁記錄數  
)  
as  
set nocount on;  
declare @ctestr nvarchar()  
declare @strSql nvarchar()  
declare @datediff datetime  
begin  
select @datediff=GetDate()  
set @ctestr='with Table_CTE as  
(select ceiling((Row_number() over(order by ID ASC))/'+str(@pageSize)+') as page_num,* from tb_TestTable)';  
set @strSql=@ctestr+' select * From Table_CTE where page_num='+str(@pageIndex)  
end  
begin  
execute sp_executesql @strSql  
select datediff(ms,@datediff,GetDate())  
set nocount off;  
end

以上的五種方法中,網上說第三種利用select top和中間變量的方法是效率最高的。關于SQL Server分頁存儲過程五種方法及性能比較的全部內容就到此結束了,希望對大家有所幫助。

相關文章

  • 一個簡單的SQL 行列轉換語句

    一個簡單的SQL 行列轉換語句

    在數據庫開發(fā)中經常會遇到行列轉換的問題,比如下面的問題,部門,員工和員工類型三張表,我們要統(tǒng)計類似這樣的列表
    2009-08-08
  • SQL Server 創(chuàng)建約束圖解(唯一 主鍵)

    SQL Server 創(chuàng)建約束圖解(唯一 主鍵)

    SQLServer中有五種約束,Primary Key約束、Foreign Key約束、Unique約束、Default約束和Check約束,今天使用SQL Server2008來演示下這幾種約束的創(chuàng)建和使用的方法
    2016-07-07
  • sqlserver 中ntext字段的批量替換(updatetext的用法)

    sqlserver 中ntext字段的批量替換(updatetext的用法)

    在Sql Server 中,ntext/text/image 字段不允許應用replace函數替換內容
    2009-09-09
  • 解決在window下執(zhí)行SQLSERVER定時備份的問題

    解決在window下執(zhí)行SQLSERVER定時備份的問題

    這篇文章主要介紹了在window下執(zhí)行SQLSERVER的定時備份,文末給大家介紹了windows任務計劃定時備份sqlserver數據庫的相關知識,使用windows的任務計劃新建一個sqlserver數據庫的定時備份任務,需要的朋友可以參考下
    2022-01-01
  • 模糊查詢

    模糊查詢

    模糊查詢...
    2006-08-08
  • sql server中查找特定類別的列的寫法

    sql server中查找特定類別的列的寫法

    要對特定類別的列進行一些操作,寫了以下的一段代碼,比較方便檢查數據庫內同一類別的所有列,示例用來查所有nvarchar的列
    2013-02-02
  • SQLServe 重復行刪除方法

    SQLServe 重復行刪除方法

    刪除 SQL Server 表中的重復行,需要的朋友可以參考下。注意備份后再執(zhí)行如下操作。
    2009-11-11
  • Mysql中悲觀鎖與樂觀鎖應用介紹

    Mysql中悲觀鎖與樂觀鎖應用介紹

    樂觀鎖對應于生活中樂觀的人總是想著事情往好的方向發(fā)展,悲觀鎖對應于生活中悲觀的人總是想著事情往壞的方向發(fā)展.這兩種人各有優(yōu)缺點,不能不以場景而定說一種人好于另外一種人,文中詳細介紹了悲觀鎖與樂觀鎖,需要的朋友可以參考下
    2022-08-08
  • SQL Server 復制需要有實際的服務器名稱才能連接到服務器

    SQL Server 復制需要有實際的服務器名稱才能連接到服務器

    今天在做sql Server 2005的實驗的時候碰到的問題,問題描述很清楚,懷疑是我以前給計算機修改了名稱而導致的.可以用select @@servername和select serverproperty ('servername')對照一下,兩個的結果是否一樣
    2012-06-06
  • SQL Server的執(zhí)行計劃

    SQL Server的執(zhí)行計劃

    查詢優(yōu)化器的輸出是查詢執(zhí)行計劃,有時稱為查詢計劃或執(zhí)行計劃。本文主要詳細介紹了SQL Server的執(zhí)行計劃,感興趣的同學可以參考閱讀
    2023-04-04

最新評論