SQL Server分页的存储过程写法以及性能比较

时间:2021-08-15 18:27:49
------创建数据库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 whereIDRank>@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(400)
declare @strSql nvarchar(400)
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

  

存储过程的5种分页写法,下面的代码是从忘了什么时候从别人那Ctrl+C来的,所以仅仅作为收藏,希望作者看到不要喷我.