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

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

创建数据库data_Test :

rush:sql;"> 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

插入数据:

rush:sql;"> 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进行分页

具体代码如下:

rush:sql;"> 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(列键)

(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,GetDate()) as 耗时 set nocount off; end

3、利用select top和中间变量

最大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,getdate()) as 耗时 set nocount off; end

4、利用Row_number() 此方法sql server 2005中新的方法,利用Row_number()给数据行加上索引

@pageSize*@pageIndex and IDRank<@pageSize*(@pageIndex+1) select datediff(ms,getdate()) as 耗时 set nocount off; end

5、利用临时表及Row_number

rush:sql;"> 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分页存储过程五种方法性能比较的全部内容就到此结束了,希望对大家有所帮助。

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...