Sql server 大数据量分页存储过程效率测试附代码

本文转自:http://www.cnblogs.com/lli0077/archive/2008/09/03/1282862.html

在项目中,我们经常遇到或用到分页,那么在大数据量(百万级以上)下,哪种分页算法效率最优呢?我们不妨用事实说话。

 

测试环境

硬件:CPU 酷睿双核T5750  内存:2G

软件:Windows server 2003    +   Sql server 2005

 

OK,我们首先创建一数据库:data_Test,并在此数据库中创建一表:tb_TestTable

 

复制代码
 1 Sql server 大数据量分页存储过程效率测试附代码 create   database  data_Test   -- 创建数据库data_Test 
 2 Sql server 大数据量分页存储过程效率测试附代码 GO  
 3 Sql server 大数据量分页存储过程效率测试附代码 use  data_Test 
 4 Sql server 大数据量分页存储过程效率测试附代码 GO  
 5 Sql server 大数据量分页存储过程效率测试附代码 create   table  tb_TestTable    -- 创建表 
 6 Sql server 大数据量分页存储过程效率测试附代码
 7 Sql server 大数据量分页存储过程效率测试附代码    id  int   identity ( 1 , 1 primary   key
 8 Sql server 大数据量分页存储过程效率测试附代码    userName  nvarchar ( 20 not   null
 9 Sql server 大数据量分页存储过程效率测试附代码    userPWD  nvarchar ( 20 not   null
10 Sql server 大数据量分页存储过程效率测试附代码    userEmail  nvarchar ( 40 null  
11 Sql server 大数据量分页存储过程效率测试附代码
12 Sql server 大数据量分页存储过程效率测试附代码 GO
复制代码

 

然后我们在数据表中插入2000000条数据:

 

复制代码
 1 Sql server 大数据量分页存储过程效率测试附代码 -- 插入数据 
 2 Sql server 大数据量分页存储过程效率测试附代码 set   identity_insert  tb_TestTable  on  
 3 Sql server 大数据量分页存储过程效率测试附代码 declare   @count   int  
 4 Sql server 大数据量分页存储过程效率测试附代码 set   @count = 1  
 5 Sql server 大数据量分页存储过程效率测试附代码 while   @count <= 2000000  
 6 Sql server 大数据量分页存储过程效率测试附代码 begin   
 7 Sql server 大数据量分页存储过程效率测试附代码     insert   into  tb_TestTable(id,userName,userPWD,userEmail)  values ( @count , ' admin ' , ' admin888 ' , ' [email protected] '
 8 Sql server 大数据量分页存储过程效率测试附代码     set   @count = @count + 1  
 9 Sql server 大数据量分页存储过程效率测试附代码 end  
10 Sql server 大数据量分页存储过程效率测试附代码 set   identity_insert  tb_TestTable  off
复制代码

 

我首先写了五个常用存储过程:

1,利用select top 和select not in进行分页,具体代码如下:

 

复制代码
 1 Sql server 大数据量分页存储过程效率测试附代码 create   procedure  proc_paged_with_notin   -- 利用select top and select not in 
 2 Sql server 大数据量分页存储过程效率测试附代码
 3 Sql server 大数据量分页存储过程效率测试附代码     @pageIndex   int ,   -- 页索引 
 4 Sql server 大数据量分页存储过程效率测试附代码      @pageSize   int      -- 每页记录数 
 5 Sql server 大数据量分页存储过程效率测试附代码
 6 Sql server 大数据量分页存储过程效率测试附代码 as  
 7 Sql server 大数据量分页存储过程效率测试附代码 begin  
 8 Sql server 大数据量分页存储过程效率测试附代码     set  nocount  on
 9 Sql server 大数据量分页存储过程效率测试附代码     declare   @timediff   datetime   -- 耗时 
10 Sql server 大数据量分页存储过程效率测试附代码      declare   @sql   nvarchar ( 500
11 Sql server 大数据量分页存储过程效率测试附代码     select   @timediff = Getdate () 
12 Sql server 大数据量分页存储过程效率测试附代码     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 '  
13 Sql server 大数据量分页存储过程效率测试附代码     execute ( @sql )   -- 因select top后不支技直接接参数,所以写成了字符串@sql 
14 Sql server 大数据量分页存储过程效率测试附代码      select   datediff (ms, @timediff , GetDate ())  as  耗时 
15 Sql server 大数据量分页存储过程效率测试附代码     set  nocount  off
16 Sql server 大数据量分页存储过程效率测试附代码 end
复制代码

 

2,利用select top 和 select max(列键)

 

 

复制代码
 1 Sql server 大数据量分页存储过程效率测试附代码 create   procedure  proc_paged_with_selectMax   -- 利用select top and select max(列) 
 2 Sql server 大数据量分页存储过程效率测试附代码
 3 Sql server 大数据量分页存储过程效率测试附代码     @pageIndex   int ,   -- 页索引 
 4 Sql server 大数据量分页存储过程效率测试附代码      @pageSize   int      -- 页记录数 
 5 Sql server 大数据量分页存储过程效率测试附代码
 6 Sql server 大数据量分页存储过程效率测试附代码 as  
 7 Sql server 大数据量分页存储过程效率测试附代码 begin  
 8 Sql server 大数据量分页存储过程效率测试附代码 set  nocount  on
 9 Sql server 大数据量分页存储过程效率测试附代码     declare   @timediff   datetime  
10 Sql server 大数据量分页存储过程效率测试附代码     declare   @sql   nvarchar ( 500
11 Sql server 大数据量分页存储过程效率测试附代码     select   @timediff = Getdate () 
12 Sql server 大数据量分页存储过程效率测试附代码     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 '  
13 Sql server 大数据量分页存储过程效率测试附代码     execute ( @sql
14 Sql server 大数据量分页存储过程效率测试附代码     select   datediff (ms, @timediff , GetDate ())  as  耗时 
15 Sql server 大数据量分页存储过程效率测试附代码 set  nocount  off
16 Sql server 大数据量分页存储过程效率测试附代码 end
复制代码

 

3,利用select top和中间变量--此方法因网上有人说效果最佳,所以贴出来一同测试

 

 

复制代码
 1 Sql server 大数据量分页存储过程效率测试附代码 create   procedure  proc_paged_with_Midvar   -- 利用ID>最大ID值和中间变量 
 2 Sql server 大数据量分页存储过程效率测试附代码
 3 Sql server 大数据量分页存储过程效率测试附代码     @pageIndex   int
 4 Sql server 大数据量分页存储过程效率测试附代码     @pageSize   int  
 5 Sql server 大数据量分页存储过程效率测试附代码
 6 Sql server 大数据量分页存储过程效率测试附代码 as  
 7 Sql server 大数据量分页存储过程效率测试附代码     declare   @count   int  
 8 Sql server 大数据量分页存储过程效率测试附代码     declare   @ID   int  
 9 Sql server 大数据量分页存储过程效率测试附代码     declare   @timediff   datetime  
10 Sql server 大数据量分页存储过程效率测试附代码     declare   @sql   nvarchar ( 500
11 Sql server 大数据量分页存储过程效率测试附代码 begin  
12 Sql server 大数据量分页存储过程效率测试附代码 set  nocount  on
13 Sql server 大数据量分页存储过程效率测试附代码     select   @count = 0 , @ID = 0 , @timediff = getdate () 
14 Sql server 大数据量分页存储过程效率测试附代码     select   @count = @count + 1 , @ID = case   when   @count <= @pageSize * @pageIndex   then  ID  else   @ID   end   from  tb_testTable  order   by  id 
15 Sql server 大数据量分页存储过程效率测试附代码     set   @sql = ' select top  ' + str ( @pageSize ) + '  * from tb_testTable where ID> ' + str ( @ID
16 Sql server 大数据量分页存储过程效率测试附代码     execute ( @sql
17 Sql server 大数据量分页存储过程效率测试附代码     select   datediff (ms, @timediff , getdate ())  as  耗时 
18 Sql server 大数据量分页存储过程效率测试附代码 set  nocount  off
19 Sql server 大数据量分页存储过程效率测试附代码 end
20 Sql server 大数据量分页存储过程效率测试附代码
复制代码

 

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

 

 

 

复制代码
 1 Sql server 大数据量分页存储过程效率测试附代码 create   procedure  proc_paged_with_Rownumber   -- 利用SQL 2005中的Row_number() 
 2 Sql server 大数据量分页存储过程效率测试附代码
 3 Sql server 大数据量分页存储过程效率测试附代码     @pageIndex   int
 4 Sql server 大数据量分页存储过程效率测试附代码     @pageSize   int  
 5 Sql server 大数据量分页存储过程效率测试附代码
 6 Sql server 大数据量分页存储过程效率测试附代码 as  
 7 Sql server 大数据量分页存储过程效率测试附代码     declare   @timediff   datetime  
 8 Sql server 大数据量分页存储过程效率测试附代码 begin  
 9 Sql server 大数据量分页存储过程效率测试附代码 set  nocount  on
10 Sql server 大数据量分页存储过程效率测试附代码     select   @timediff = getdate () 
11 Sql server 大数据量分页存储过程效率测试附代码     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
12 Sql server 大数据量分页存储过程效率测试附代码     select   datediff (ms, @timediff , getdate ())  as  耗时 
13 Sql server 大数据量分页存储过程效率测试附代码 set  nocount  off
14 Sql server 大数据量分页存储过程效率测试附代码 end
15 Sql server 大数据量分页存储过程效率测试附代码
复制代码

5,利用临时表及Row_number

 

 

复制代码
 1 Sql server 大数据量分页存储过程效率测试附代码 create   procedure  proc_CTE   -- 利用临时表及Row_number 
 2 Sql server 大数据量分页存储过程效率测试附代码
 3 Sql server 大数据量分页存储过程效率测试附代码     @pageIndex   int ,   -- 页索引 
 4 Sql server 大数据量分页存储过程效率测试附代码      @pageSize   int      -- 页记录数 
 5 Sql server 大数据量分页存储过程效率测试附代码
 6 Sql server 大数据量分页存储过程效率测试附代码 as  
 7 Sql server 大数据量分页存储过程效率测试附代码     set  nocount  on
 8 Sql server 大数据量分页存储过程效率测试附代码     declare   @ctestr   nvarchar ( 400
 9 Sql server 大数据量分页存储过程效率测试附代码     declare   @strSql   nvarchar ( 400
10 Sql server 大数据量分页存储过程效率测试附代码     declare   @datediff   datetime  
11 Sql server 大数据量分页存储过程效率测试附代码 begin  
12 Sql server 大数据量分页存储过程效率测试附代码     select   @datediff = GetDate () 
13 Sql server 大数据量分页存储过程效率测试附代码     set   @ctestr = ' with Table_CTE as 
14 Sql server 大数据量分页存储过程效率测试附代码                (select ceiling((Row_number() over(order by ID ASC))/ ' + str ( @pageSize ) + ' ) as page_num,* from tb_TestTable) '
15 Sql server 大数据量分页存储过程效率测试附代码     set   @strSql = @ctestr + '  select * From Table_CTE where page_num= ' + str ( @pageIndex
16 Sql server 大数据量分页存储过程效率测试附代码 end  
17 Sql server 大数据量分页存储过程效率测试附代码     begin  
18 Sql server 大数据量分页存储过程效率测试附代码         execute  sp_executesql  @strSql  
19 Sql server 大数据量分页存储过程效率测试附代码         select   datediff (ms, @datediff , GetDate ()) 
20 Sql server 大数据量分页存储过程效率测试附代码     set  nocount  off
21 Sql server 大数据量分页存储过程效率测试附代码     end
22 Sql server 大数据量分页存储过程效率测试附代码
复制代码

 

OK,至此,存储过程创建完毕,我们分别在每页10条数据的情况下在第2页,第1000页,第10000页,第100000页,第199999页进行测试,耗时单位:ms  每页测试5次取其平均值

 

存过 第2页耗时 第1000页耗时 第10000页耗时 第100000页耗时 第199999页耗时 效率排行
1用not in 0ms 16ms 47ms 475ms 953ms 3
2用select max 5ms 16ms 35ms 325ms 623ms 1
3中间变量 966ms 970ms 960ms 945ms 933ms 5
4row_number 0ms 0ms 34ms 365ms 710ms 2
4临时表 780ms 796ms 798ms 780ms 805ms 4

 

 

测试结果显示:select max >row_number>not in>临时表>中间变量

 

于是我对效率最高的select max方法用2分法进行了扩展,代码取自互联网,我修改了ASC排序时取不到值的BUG,测试结果:

 

2分法 156ms 156ms 180ms 470ms 156ms 1*

 

从测试结果来看,使用2分法确实可以提高效率并使效率更为稳定,我又增加了第159999页的测试,用时仅296ms,效果相当的不错!

 

下面是2分法使用select max的代码,已相当完善。

 

 

复制代码
  1 Sql server 大数据量分页存储过程效率测试附代码 -- /*-----存储过程 分页处理 孙伟 2005-03-28创建 -------*/ 
  2 Sql server 大数据量分页存储过程效率测试附代码-- /*-----存储过程 分页处理 浪尘 2008-9-1修改----------*/ 
  3 Sql server 大数据量分页存储过程效率测试附代码-- /*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 -------*/ 
  4 Sql server 大数据量分页存储过程效率测试附代码
  5 Sql server 大数据量分页存储过程效率测试附代码 alter   PROCEDURE  proc_paged_2part_selectMax 
  6 Sql server 大数据量分页存储过程效率测试附代码
  7 Sql server 大数据量分页存储过程效率测试附代码 @tblName       nvarchar ( 200 ),         -- --要显示的表或多个表的连接 
  8 Sql server 大数据量分页存储过程效率测试附代码 @fldName       nvarchar ( 500 =   ' * ' ,     -- --要显示的字段列表 
  9 Sql server 大数据量分页存储过程效率测试附代码 @pageSize      int   =   10 ,         -- --每页显示的记录个数 
 10 Sql server 大数据量分页存储过程效率测试附代码 @page          int   =   1 ,         -- --要显示那一页的记录 
 11 Sql server 大数据量分页存储过程效率测试附代码 @fldSort      nvarchar ( 200 =   null ,     -- --排序字段列表或条件 
 12 Sql server 大数据量分页存储过程效率测试附代码 @Sort          bit   =   0 ,         -- --排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ') 
 13 Sql server 大数据量分页存储过程效率测试附代码 @strCondition      nvarchar ( 1000 =   null ,     -- --查询条件,不需where 
 14 Sql server 大数据量分页存储过程效率测试附代码 @ID          nvarchar ( 150 ),         -- --主表的主键 
 15 Sql server 大数据量分页存储过程效率测试附代码 @Dist                   bit   =   0 ,            -- --是否添加查询字段的 DISTINCT 默认0不添加/1添加 
 16 Sql server 大数据量分页存储过程效率测试附代码 @pageCount      int   =   1  output,             -- --查询结果分页后的总页数 
 17 Sql server 大数据量分页存储过程效率测试附代码 @Counts      int   =   1  output                 -- --查询到的记录数 
 18 Sql server 大数据量分页存储过程效率测试附代码
 19 Sql server 大数据量分页存储过程效率测试附代码 AS  
 20 Sql server 大数据量分页存储过程效率测试附代码 SET  NOCOUNT  ON  
 21 Sql server 大数据量分页存储过程效率测试附代码 Declare   @sqlTmp   nvarchar ( 1000 )         -- --存放动态生成的SQL语句 
 22 Sql server 大数据量分页存储过程效率测试附代码 Declare   @strTmp   nvarchar ( 1000 )         -- --存放取得查询结果总数的查询语句 
 23 Sql server 大数据量分页存储过程效率测试附代码 Declare   @strID       nvarchar ( 1000 )         -- --存放取得查询开头或结尾ID的查询语句 
 24 Sql server 大数据量分页存储过程效率测试附代码
 25 Sql server 大数据量分页存储过程效率测试附代码 Declare   @strSortType   nvarchar ( 10 )     -- --数据排序规则A 
 26 Sql server 大数据量分页存储过程效率测试附代码 Declare   @strFSortType   nvarchar ( 10 )     -- --数据排序规则B 
 27 Sql server 大数据量分页存储过程效率测试附代码
 28 Sql server 大数据量分页存储过程效率测试附代码 Declare   @SqlSelect   nvarchar ( 50 )          -- --对含有DISTINCT的查询进行SQL构造 
 29 Sql server 大数据量分页存储过程效率测试附代码 Declare   @SqlCounts   nvarchar ( 50 )           -- --对含有DISTINCT的总数查询进行SQL构造 
 30 Sql server 大数据量分页存储过程效率测试附代码
 31 Sql server 大数据量分页存储过程效率测试附代码 declare   @timediff   datetime    -- 耗时测试时间差 
 32 Sql server 大数据量分页存储过程效率测试附代码 select   @timediff = getdate () 
 33 Sql server 大数据量分页存储过程效率测试附代码
 34 Sql server 大数据量分页存储过程效率测试附代码 if   @Dist    =   0  
 35 Sql server 大数据量分页存储过程效率测试附代码 begin  
 36 Sql server 大数据量分页存储过程效率测试附代码     set   @SqlSelect   =   ' select  '  
 37 Sql server 大数据量分页存储过程效率测试附代码     set   @SqlCounts   =   ' Count(*) '  
 38 Sql server 大数据量分页存储过程效率测试附代码 end  
 39 Sql server 大数据量分页存储过程效率测试附代码 else  
 40 Sql server 大数据量分页存储过程效率测试附代码 begin  
 41 Sql server 大数据量分页存储过程效率测试附代码     set   @SqlSelect   =   ' select distinct  '  
 42 Sql server 大数据量分页存储过程效率测试附代码     set   @SqlCounts   =   ' Count(DISTINCT  ' + @ID + ' ) '  
 43 Sql server 大数据量分页存储过程效率测试附代码 end  
 44 Sql server 大数据量分页存储过程效率测试附代码
 45 Sql server 大数据量分页存储过程效率测试附代码
 46 Sql server 大数据量分页存储过程效率测试附代码 if   @Sort = 0  
 47 Sql server 大数据量分页存储过程效率测试附代码 begin  
 48 Sql server 大数据量分页存储过程效率测试附代码     set   @strFSortType = '  ASC  '  
 49 Sql server 大数据量分页存储过程效率测试附代码     set   @strSortType = '  DESC  '  
 50 Sql server 大数据量分页存储过程效率测试附代码 end  
 51 Sql server 大数据量分页存储过程效率测试附代码 else  
 52 Sql server 大数据量分页存储过程效率测试附代码 begin  
 53 Sql server 大数据量分页存储过程效率测试附代码     set   @strFSortType = '  DESC  '  
 54 Sql server 大数据量分页存储过程效率测试附代码     set   @strSortType = '  ASC  '  
 55 Sql server 大数据量分页存储过程效率测试附代码 end  
 56 Sql server 大数据量分页存储过程效率测试附代码
 57 Sql server 大数据量分页存储过程效率测试附代码
 58 Sql server 大数据量分页存储过程效率测试附代码
 59 Sql server 大数据量分页存储过程效率测试附代码 -- ------生成查询语句-------- 
 60 Sql server 大数据量分页存储过程效率测试附代码-- 此处@strTmp为取得查询结果数量的语句 
 61 Sql server 大数据量分页存储过程效率测试附代码 if   @strCondition   is   null   or   @strCondition = ''       -- 没有设置显示条件 
 62 Sql server 大数据量分页存储过程效率测试附代码 begin  
 63 Sql server 大数据量分页存储过程效率测试附代码     set   @sqlTmp   =    @fldName   +   '  From  '   +   @tblName  
 64 Sql server 大数据量分页存储过程效率测试附代码     set   @strTmp   =   @SqlSelect + '  @Counts= ' + @SqlCounts + '  FROM  ' + @tblName  
 65 Sql server 大数据量分页存储过程效率测试附代码     set   @strID   =   '  From  '   +   @tblName  
 66 Sql server 大数据量分页存储过程效率测试附代码 end  
 67 Sql server 大数据量分页存储过程效率测试附代码 else  
 68 Sql server 大数据量分页存储过程效率测试附代码 begin  
 69 Sql server 大数据量分页存储过程效率测试附代码     set   @sqlTmp   =   +   @fldName   +   ' From  '   +   @tblName   +   '  where (1>0)  '   +   @strCondition  
 70 Sql server 大数据量分页存储过程效率测试附代码     set   @strTmp   =   @SqlSelect + '  @Counts= ' + @SqlCounts + '  FROM  ' + @tblName   +   '  where (1>0)  '   +   @strCondition  
 71 Sql server 大数据量分页存储过程效率测试附代码     set   @strID   =   '  From  '   +   @tblName   +   '  where (1>0)  '   +   @strCondition  
 72 Sql server 大数据量分页存储过程效率测试附代码 end  
 73 Sql server 大数据量分页存储过程效率测试附代码
 74 Sql server 大数据量分页存储过程效率测试附代码 -- --取得查询结果总数量----- 
 75 Sql server 大数据量分页存储过程效率测试附代码 exec  sp_executesql  @strTmp ,N ' @Counts int out  ' , @Counts  out 
 76 Sql server 大数据量分页存储过程效率测试附代码 declare   @tmpCounts   int  
 77 Sql server 大数据量分页存储过程效率测试附代码 if   @Counts   =   0  
 78 Sql server 大数据量分页存储过程效率测试附代码     set   @tmpCounts   =   1  
 79 Sql server 大数据量分页存储过程效率测试附代码 else  
 80 Sql server 大数据量分页存储过程效率测试附代码     set   @tmpCounts   =   @Counts  
 81 Sql server 大数据量分页存储过程效率测试附代码
 82 Sql server 大数据量分页存储过程效率测试附代码     -- 取得分页总数 
 83 Sql server 大数据量分页存储过程效率测试附代码      set   @pageCount = ( @tmpCounts + @pageSize - 1 ) / @pageSize  
 84 Sql server 大数据量分页存储过程效率测试附代码
 85 Sql server 大数据量分页存储过程效率测试附代码     /**/ /**当前页大于总页数 取最后一页**/  
 86 Sql server 大数据量分页存储过程效率测试附代码     if   @page > @pageCount  
 87 Sql server 大数据量分页存储过程效率测试附代码         set   @page = @pageCount  
 88 Sql server 大数据量分页存储过程效率测试附代码
 89 Sql server 大数据量分页存储过程效率测试附代码     -- /*-----数据分页2分处理-------*/ 
 90 Sql server 大数据量分页存储过程效率测试附代码      declare   @pageIndex   int   -- 总数/页大小 
 91 Sql server 大数据量分页存储过程效率测试附代码      declare   @lastcount   int   -- 总数%页大小  
 92 Sql server 大数据量分页存储过程效率测试附代码
 93 Sql server 大数据量分页存储过程效率测试附代码     set   @pageIndex   =   @tmpCounts / @pageSize  
 94 Sql server 大数据量分页存储过程效率测试附代码     set   @lastcount   =   @tmpCounts % @pageSize  
 95 Sql server 大数据量分页存储过程效率测试附代码     if   @lastcount   >   0  
 96 Sql server 大数据量分页存储过程效率测试附代码         set   @pageIndex   =   @pageIndex   +   1  
 97 Sql server 大数据量分页存储过程效率测试附代码     else  
 98 Sql server 大数据量分页存储过程效率测试附代码         set   @lastcount   =   @pagesize  
 99 Sql server 大数据量分页存储过程效率测试附代码
100 Sql server 大数据量分页存储过程效率测试附代码     -- //***显示分页 
101 Sql server 大数据量分页存储过程效率测试附代码      if   @strCondition   is   null   or   @strCondition = ''       -- 没有设置显示条件 
102 Sql server 大数据量分页存储过程效率测试附代码      begin  
103 Sql server 大数据量分页存储过程效率测试附代码         if   @pageIndex < 2   or   @page <= @pageIndex   /   2   +   @pageIndex   %   2     -- 前半部分数据处理 
104 Sql server 大数据量分页存储过程效率测试附代码              begin   
105 Sql server 大数据量分页存储过程效率测试附代码                 if   @page = 1  
106 Sql server 大数据量分页存储过程效率测试附代码                     set   @strTmp = @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName                          
107 Sql server 大数据量分页存储过程效率测试附代码                         + '  order by  ' +   @fldSort   + '   ' +   @strFSortType  
108 Sql server 大数据量分页存储过程效率测试附代码                 else  
109 Sql server 大数据量分页存储过程效率测试附代码                 begin  
110 Sql server 大数据量分页存储过程效率测试附代码                     if   @Sort = 1  
111 Sql server 大数据量分页存储过程效率测试附代码                     begin                      
112 Sql server 大数据量分页存储过程效率测试附代码                     set   @strTmp = @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName  
113 Sql server 大数据量分页存储过程效率测试附代码                         + '  where  ' + @ID + '  <(select min( ' +   @ID   + ' ) from ( ' +   @SqlSelect + '  top  ' +   CAST ( @pageSize * ( @page - 1 as   Varchar ( 20 ))  + '   ' +   @ID   + '  from  ' + @tblName  
114 Sql server 大数据量分页存储过程效率测试附代码                         + '  order by  ' +   @fldSort   + '   ' +   @strFSortType + ' ) AS TBMinID) '  
115 Sql server 大数据量分页存储过程效率测试附代码                         + '  order by  ' +   @fldSort   + '   ' +   @strFSortType  
116 Sql server 大数据量分页存储过程效率测试附代码                     end  
117 Sql server 大数据量分页存储过程效率测试附代码                     else  
118 Sql server 大数据量分页存储过程效率测试附代码                     begin  
119 Sql server 大数据量分页存储过程效率测试附代码                     set   @strTmp = @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName  
120 Sql server 大数据量分页存储过程效率测试附代码                         + '  where  ' + @ID + '  >(select max( ' +   @ID   + ' ) from ( ' +   @SqlSelect + '  top  ' +   CAST ( @pageSize * ( @page - 1 as   Varchar ( 20 ))  + '   ' +   @ID   + '  from  ' + @tblName  
121 Sql server 大数据量分页存储过程效率测试附代码                         + '  order by  ' +   @fldSort   + '   ' +   @strFSortType + ' ) AS TBMinID) '  
122 Sql server 大数据量分页存储过程效率测试附代码                         + '  order by  ' +   @fldSort   + '   ' +   @strFSortType   
123 Sql server 大数据量分页存储过程效率测试附代码                     end  
124 Sql server 大数据量分页存储过程效率测试附代码                 end      
125 Sql server 大数据量分页存储过程效率测试附代码             end  
126 Sql server 大数据量分页存储过程效率测试附代码         else  
127 Sql server 大数据量分页存储过程效率测试附代码             begin  
128 Sql server 大数据量分页存储过程效率测试附代码             set   @page   =   @pageIndex - @page + 1   -- 后半部分数据处理 
129 Sql server 大数据量分页存储过程效率测试附代码                  if   @page   <=   1   -- 最后一页数据显示                 
130 Sql server 大数据量分页存储过程效率测试附代码                      set   @strTmp = @SqlSelect + '  * from ( ' + @SqlSelect + '  top  ' +   CAST ( @lastcount   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName  
131 Sql server 大数据量分页存储过程效率测试附代码                         + '  order by  ' +   @fldSort   + '   ' +   @strSortType + ' ) AS TempTB ' + '  order by  ' +   @fldSort   + '   ' +   @strFSortType   
132 Sql server 大数据量分页存储过程效率测试附代码                 else  
133 Sql server 大数据量分页存储过程效率测试附代码                     if   @Sort = 1  
134 Sql server 大数据量分页存储过程效率测试附代码                     begin  
135 Sql server 大数据量分页存储过程效率测试附代码                     set   @strTmp = @SqlSelect + '  * from ( ' + @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName  
136 Sql server 大数据量分页存储过程效率测试附代码                         + '  where  ' + @ID + '  >(select max( ' +   @ID   + ' ) from( ' +   @SqlSelect + '  top  ' +   CAST ( @pageSize * ( @page - 2 ) + @lastcount   as   Varchar ( 20 ))  + '   ' +   @ID   + '  from  ' + @tblName  
137 Sql server 大数据量分页存储过程效率测试附代码                         + '  order by  ' +   @fldSort   + '   ' +   @strSortType + ' ) AS TBMaxID) '  
138 Sql server 大数据量分页存储过程效率测试附代码                         + '  order by  ' +   @fldSort   + '   ' +   @strSortType + ' ) AS TempTB ' + '  order by  ' +   @fldSort   + '   ' +   @strFSortType  
139 Sql server 大数据量分页存储过程效率测试附代码                     end  
140 Sql server 大数据量分页存储过程效率测试附代码                     else  
141 Sql server 大数据量分页存储过程效率测试附代码                     begin  
142 Sql server 大数据量分页存储过程效率测试附代码                     set   @strTmp = @SqlSelect + '  * from ( ' + @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName  
143 Sql server 大数据量分页存储过程效率测试附代码                         + '  where  ' + @ID + '  <(select min( ' +   @ID   + ' ) from( ' +   @SqlSelect + '  top  ' +   CAST ( @pageSize * ( @page - 2 ) + @lastcount   as   Varchar ( 20 ))  + '   ' +   @ID   + '  from  ' + @tblName  
144 Sql server 大数据量分页存储过程效率测试附代码                         + '  order by  ' +   @fldSort   + '   ' +   @strSortType + ' ) AS TBMaxID) '  
145 Sql server 大数据量分页存储过程效率测试附代码                         + '  order by  ' +   @fldSort   + '   ' +   @strSortType + ' ) AS TempTB ' + '  order by  ' +   @fldSort   + '   ' +   @strFSortType   
146 Sql server 大数据量分页存储过程效率测试附代码                     end  
147 Sql server 大数据量分页存储过程效率测试附代码             end  
148 Sql server 大数据量分页存储过程效率测试附代码     end  
149 Sql server 大数据量分页存储过程效率测试附代码
150 Sql server 大数据量分页存储过程效率测试附代码     else   -- 有查询条件 
151 Sql server 大数据量分页存储过程效率测试附代码      begin  
152 Sql server 大数据量分页存储过程效率测试附代码         if   @pageIndex < 2   or   @page <= @pageIndex   /   2   +   @pageIndex   %   2     -- 前半部分数据处理 
153 Sql server 大数据量分页存储过程效率测试附代码          begin  
154 Sql server 大数据量分页存储过程效率测试附代码                 if   @page = 1  
155 Sql server 大数据量分页存储过程效率测试附代码                     set   @strTmp = @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName                          
156 Sql server 大数据量分页存储过程效率测试附代码                         + '  where 1=1  '   +   @strCondition   +   '  order by  ' +   @fldSort   + '   ' +   @strFSortType  
157 Sql server 大数据量分页存储过程效率测试附代码                 else   if ( @Sort = 1
158 Sql server 大数据量分页存储过程效率测试附代码                 begin                      
159 Sql server 大数据量分页存储过程效率测试附代码                     set   @strTmp = @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName  
160 Sql server 大数据量分页存储过程效率测试附代码                         + '  where  ' + @ID + '  <(select min( ' +   @ID   + ' ) from ( ' +   @SqlSelect + '  top  ' +   CAST ( @pageSize * ( @page - 1 as   Varchar ( 20 ))  + '   ' +   @ID   + '  from  ' + @tblName  
161 Sql server 大数据量分页存储过程效率测试附代码                         + '  where (1=1)  '   +   @strCondition   + '  order by  ' +   @fldSort   + '   ' +   @strFSortType + ' ) AS TBMinID) '  
162 Sql server 大数据量分页存储过程效率测试附代码                         + '   ' +   @strCondition   + '  order by  ' +   @fldSort   + '   ' +   @strFSortType  
163 Sql server 大数据量分页存储过程效率测试附代码                 end  
164 Sql server 大数据量分页存储过程效率测试附代码                 else  
165 Sql server 大数据量分页存储过程效率测试附代码                 begin  
166 Sql server 大数据量分页存储过程效率测试附代码                     set   @strTmp = @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName  
167 Sql server 大数据量分页存储过程效率测试附代码                         + '  where  ' + @ID + '  >(select max( ' +   @ID   + ' ) from ( ' +   @SqlSelect + '  top  ' +   CAST ( @pageSize * ( @page - 1 as   Varchar ( 20 ))  + '   ' +   @ID   + '  from  ' + @tblName  
168 Sql server 大数据量分页存储过程效率测试附代码                         + '  where (1=1)  '   +   @strCondition   + '  order by  ' +   @fldSort   + '   ' +   @strFSortType + ' ) AS TBMinID) '  
169 Sql server 大数据量分页存储过程效率测试附代码                         + '   ' +   @strCondition   + '  order by  ' +   @fldSort   + '   ' +   @strFSortType   
170 Sql server 大数据量分页存储过程效率测试附代码                 end             
171 Sql server 大数据量分页存储过程效率测试附代码         end  
172 Sql server 大数据量分页存储过程效率测试附代码         else  
173 Sql server 大数据量分页存储过程效率测试附代码         begin   
174 Sql server 大数据量分页存储过程效率测试附代码             set   @page   =   @pageIndex - @page + 1   -- 后半部分数据处理 
175 Sql server 大数据量分页存储过程效率测试附代码              if   @page   <=   1   -- 最后一页数据显示 
176 Sql server 大数据量分页存储过程效率测试附代码                      set   @strTmp = @SqlSelect + '  * from ( ' + @SqlSelect + '  top  ' +   CAST ( @lastcount   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName  
177 Sql server 大数据量分页存储过程效率测试附代码                         + '  where (1=1)  ' +   @strCondition   + '  order by  ' +   @fldSort   + '   ' +   @strSortType + ' ) AS TempTB ' + '  order by  ' +   @fldSort   + '   ' +   @strFSortType                       
178 Sql server 大数据量分页存储过程效率测试附代码             else   if ( @Sort = 1
179 Sql server 大数据量分页存储过程效率测试附代码                     set   @strTmp = @SqlSelect + '  * from ( ' + @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName  
180 Sql server 大数据量分页存储过程效率测试附代码                         + '  where  ' + @ID + '  >(select max( ' +   @ID   + ' ) from( ' +   @SqlSelect + '  top  ' +   CAST ( @pageSize * ( @page - 2 ) + @lastcount   as   Varchar ( 20 ))  + '   ' +   @ID   + '  from  ' + @tblName  
181 Sql server 大数据量分页存储过程效率测试附代码                         + '  where (1=1)  ' +   @strCondition   + '  order by  ' +   @fldSort   + '   ' +   @strSortType + ' ) AS TBMaxID) '  
182 Sql server 大数据量分页存储过程效率测试附代码                         + '   ' +   @strCondition + '  order by  ' +   @fldSort   + '   ' +   @strSortType + ' ) AS TempTB ' + '  order by  ' +   @fldSort   + '   ' +   @strFSortType      
183 Sql server 大数据量分页存储过程效率测试附代码             else  
184 Sql server 大数据量分页存储过程效率测试附代码                     set   @strTmp = @SqlSelect + '  * from ( ' + @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName  
185 Sql server 大数据量分页存储过程效率测试附代码                         + '  where  ' + @ID + '  <(select min( ' +   @ID   + ' ) from( ' +   @SqlSelect + '  top  ' +   CAST ( @pageSize * ( @page - 2 ) + @lastcount   as   Varchar ( 20 ))  + '   ' +   @ID   + '  from  ' + @tblName  
186 Sql server 大数据量分页存储过程效率测试附代码                         + '  where (1=1)  ' +   @strCondition   + '  order by  ' +   @fldSort   + '   ' +   @strSortType + ' ) AS TBMaxID) '  
187 Sql server 大数据量分页存储过程效率测试附代码                         + '   ' +   @strCondition + '  order by  ' +   @fldSort   + '   ' +   @strSortType + ' ) AS TempTB ' + '  order by  ' +   @fldSort   + '   ' +   @strFSortType              
188 Sql server 大数据量分页存储过程效率测试附代码         end      
189 Sql server 大数据量分页存储过程效率测试附代码     end  
190 Sql server 大数据量分页存储过程效率测试附代码
191 Sql server 大数据量分页存储过程效率测试附代码 -- ----返回查询结果----- 
192 Sql server 大数据量分页存储过程效率测试附代码 exec  sp_executesql  @strTmp  
193 Sql server 大数据量分页存储过程效率测试附代码 select   datediff (ms, @timediff , getdate ())  as  耗时 
194 Sql server 大数据量分页存储过程效率测试附代码 -- print @strTmp 
195 Sql server 大数据量分页存储过程效率测试附代码 SET  NOCOUNT  OFF  
196 Sql server 大数据量分页存储过程效率测试附代码 GO
197 Sql server 大数据量分页存储过程效率测试附代码
复制代码

 

执行示例:exec proc_paged_2part_selectMax 'tb_testTable','ID,userName,userPWD,userEmail',10,100000,'ID',0,null,'ID',0

 

这种测试只在单机进行,并且没有在实际开发WEB项目中分页测试,测试项也比较单一,所以不够全面系统,但从其效率相比上,我们可以在数据库分页算法上进行有效的控制。

 

你可能感兴趣的:(SQL Server)