zoukankan      html  css  js  c++  java
  • 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
    

      

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

  • 相关阅读:
    [HNOI2006]鬼谷子的钱袋
    一日游与两道题
    [HNOI2009]梦幻布丁
    [Ahoi2009]self 同类分布
    50 days before NOI2017
    Topcoder SRM 606 div1题解
    Topcoder SRM 605 div1 题解
    Topcoder SRM 604 div1题解
    Topcoder SRM 603 div1题解
    Topcoder SRM 602 div1题解
  • 原文地址:https://www.cnblogs.com/ranlin/p/2130093.html
Copyright © 2011-2022 走看看