浅谈基于SQL Server分页存储过程五种方法及性能比较

栏目: 数据库 · SQL Server · 发布时间: 6年前

内容简介:本文由codercto小编给大家分享了五种sqlserver分页存储过程及性能比较,接下来我们跟着小编一起了解了解吧

SQL Server数据库操作中,我们常常会用到存储过程对实现对查询的数据的分页处理,以方便浏览者的浏览。

创建数据库data_Test :

create database data_Test  
GO  
use data_Test  
GO  
create table tb_TestTable  --创建表  
(  
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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript and Ajax for the Web, Sixth Edition

JavaScript and Ajax for the Web, Sixth Edition

Tom Negrino、Dori Smith / Peachpit Press / August 28, 2006 / $24.99

Book Description Need to learn JavaScript fast? This best-selling reference’s visual format and step-by-step, task-based instructions will have you up and running with JavaScript in no time. In thi......一起来看看 《JavaScript and Ajax for the Web, Sixth Edition》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具