SQL Server分页的存储过程写法以及性能比较
Posted mythp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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‘ , ‘[email protected]‘ ) set @[email protected]+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 @[email protected]+1,@ID= case when @count<[email protected]*@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(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 @[email protected]+ ‘ 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来的,所以仅仅作为收藏,希望作者看到不要喷我.
以上是关于SQL Server分页的存储过程写法以及性能比较的主要内容,如果未能解决你的问题,请参考以下文章
基于Dapper的分页实现,支持筛选,排序,结果集总数,非存储过程