大数据量分页存储过程效率测试附代码(上)

发表于:2010-7-29 11:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

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

01    create procedure proc_paged_with_Midvar --利用ID>最大ID值和中间变量
02    (
03     @pageIndex int,
04     @pageSize int
05    )
06    as
07     declare @count int
08     declare @ID int
09     declare @timediff datetime
10     declare @sql nvarchar(500)
11    begin
12    set nocount on;
13     select @count=0,@ID=0,@timediff=getdate()
14     select @count=@count+1,@ID=case when @count<=@pageSize*@pageIndex then ID else @ID end from tb_testTable order by id
15     set @sql='select top '+str(@pageSize)+' * from tb_testTable where ID>'+str(@ID)
16     execute(@sql)
17     select datediff(ms,@timediff,getdate()) as 耗时
18    set nocount off;
19    end

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

01    create procedure proc_paged_with_Rownumber --利用SQL 2005中的Row_number()
02    (
03     @pageIndex int,
04     @pageSize int
05    )
06    as
07     declare @timediff datetime
08    begin
09    set nocount on;
10     select @timediff=getdate()
11     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     select datediff(ms,@timediff,getdate()) as 耗时
13    set nocount off;
14    end

  5,利用临时表及Row_number

01    create procedure proc_CTE --利用临时表及Row_number
02    (
03     @pageIndex int, --页索引
04     @pageSize int --页记录数
05    )
06    as
07     set nocount on;
08     declare @ctestr nvarchar(400)
09     declare @strSql nvarchar(400)
10     declare @datediff datetime
11    begin
12     select @datediff=GetDate()
13     set @ctestr='with Table_CTE as
14      (select ceiling((Row_number() over(order by ID ASC))/'+str(@pageSize)+') as page_num,* from tb_TestTable)';
15       set @strSql=@ctestr+' select * From Table_CTE where page_num='+str(@pageIndex)
16      end
17    begin
18      execute sp_executesql @strSql
19      select datediff(ms,@datediff,GetDate())
20      set nocount off;
21    end
 
32/3<123>
价值398元的测试课程免费赠送,填问卷领取吧!

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海漕溪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2022
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号