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

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

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

在SQL Server數(shù)據(jù)庫操作中,我們常常會(huì)用到存儲(chǔ)過程對(duì)實(shí)現(xiàn)對(duì)查詢的數(shù)據(jù)的分頁處理,以方便瀏覽者的瀏覽。

創(chuàng)建數(shù)據(jù)庫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 

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

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進(jìn)行分頁

具體代碼如下:

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

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

create procedure proc_paged_with_selectMax --利用select top and select max(列)  
(  
@pageIndex int, --頁索引  
@pageSize int  --頁記錄數(shù)  
)  
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 耗時(shí)  
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 耗時(shí)  
set nocount off;  
end 

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

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 耗時(shí)  
set nocount off;  
end

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

create procedure proc_CTE --利用臨時(shí)表及Row_number  
(  
@pageIndex int, --頁索引  
@pageSize int  --頁記錄數(shù)  
)  
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

以上的五種方法中,網(wǎng)上說第三種利用select top和中間變量的方法是效率最高的。關(guān)于SQL Server分頁存儲(chǔ)過程五種方法及性能比較的全部?jī)?nèi)容就到此結(jié)束了,希望對(duì)大家有所幫助。

相關(guān)文章

  • 一個(gè)簡(jiǎn)單的SQL 行列轉(zhuǎn)換語句

    一個(gè)簡(jiǎn)單的SQL 行列轉(zhuǎn)換語句

    在數(shù)據(jù)庫開發(fā)中經(jīng)常會(huì)遇到行列轉(zhuǎn)換的問題,比如下面的問題,部門,員工和員工類型三張表,我們要統(tǒng)計(jì)類似這樣的列表
    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 字段不允許應(yīng)用replace函數(shù)替換內(nèi)容
    2009-09-09
  • 解決在window下執(zhí)行SQLSERVER定時(shí)備份的問題

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

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

    模糊查詢

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

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

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

    SQLServe 重復(fù)行刪除方法

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

    Mysql中悲觀鎖與樂觀鎖應(yīng)用介紹

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

    SQL Server 復(fù)制需要有實(shí)際的服務(wù)器名稱才能連接到服務(wù)器

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

    SQL Server的執(zhí)行計(jì)劃

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

最新評(píng)論