控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

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

作者:佚名 出处:互联网 2011年08月08日 阅读:

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(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

 

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统