织梦CMS - 轻松建站从此开始!

罗索

SqlServer2005中分页代码测试

jackyhwei 发布于 2010-09-15 16:38 点击:次 
参考了csdn.net帖子,我对分页代码进行了测试,增加一部分测试内容。我测试的表t_um_ob_gprs_log 共有数据近30W条,有时间我将用此脚本在服务器上测试近亿数据的表。
TAG:

参考了这篇帖子:http://topic.csdn.net/u/20100617/04/80D1BD99-2E1C-4083-AD87-72BF706CB536.html,我对分页代码进行了测试,增加一部分测试内容。我测试的表t_um_ob_gprs_log 共有数据近30W条,有时间我将用此脚本在服务器上测试近亿数据的表。

  1. --开始测试查询 
  2. declare @now datetime 
  3. --max方案 
  4. select 'max'方案 
  5. select @now=getdate() 
  6. --begin 
  7. select top 10 * from Student 
  8. where Id>( 
  9.   select max(Id) 
  10.   from ( 
  11.     select top 1999990 Id from Student order by Id)tt) 
  12. --end 
  13. declare @maxDiff int 
  14. select @maxDiff=datediff(ms,@now,getdate()) 
  15.  
  16. --top方案 
  17. select 'top'方案 
  18. select @now=getdate() 
  19. --begin 
  20. select top 10 * from Student 
  21. where Id not in(select top  1999990 Id from Student) 
  22. --end 
  23. declare @topDiff int 
  24. select @topDiff=datediff(ms,@now,getdate()) 
  25.  
  26. --row方案 
  27. select 'row'方案 
  28. select @now=getdate() 
  29. --begin 
  30. select * 
  31. from ( 
  32. select row_number()over(order by tc)rn,* 
  33. from (select top 2000000 0 tc,* from Student)t 
  34. )tt 
  35. where rn>1999990 
  36. --end 
  37. declare @rowDiff int 
  38. select @rowDiff=datediff(ms,@now,getdate()) 
  39.  
  40. --row_number方案 
  41. select 'row_number'方案 
  42. select @now=getdate() 
  43. --begin 
  44. select * 
  45. from
  46. select top 2000000 row_number()over(order by Id)rn,* from Student 
  47. )t 
  48. where rn>1999990 
  49. --end 
  50. declare @row_numberDiff int 
  51. select @row_numberDiff=datediff(ms,@now,getdate()) 
  52.  
  53. --记录结果 
  54. select '第20万页'页码,@maxDiff max方案,@topDiff top方案,
  55. @rowDiff row方案,@row_numberDiff row_number方案 

测试结果:(执行了5次)

  1. 1) 页码                max方案       top方案       row方案       row_number 
  2. 方案----------------- ----------- ----------- ----------- ------------ 
  3. 第199999 - 200009  126         156         76          76  
  4. 2)页码                max方案       top方案       row方案       row_number 
  5. 方案----------------- ----------- ----------- ----------- ------------ 
  6. 第199999 - 200009  156         140         96          76  
  7. 3) 页码                max方案       top方案       row方案       row_number 
  8. 方案----------------- ----------- ----------- ----------- ------------ 
  9. 第199999 - 200009  186         140         93          80  
  10. 4) 页码                max方案       top方案       row方案       row_number 
  11. 方案----------------- ----------- ----------- ----------- ------------ 
  12. 第199999 - 200009  173         186         96          76  
  13. 5)页码                max方案       top方案       row方案       row_number 
  14. 方案----------------- ----------- ----------- ----------- ------------ 
  15. 第199999 - 200009  186         143         76          93  

可见row_num ber方案还是很有优势的,而两种不同的row_number写法执行时间并没有明显的差距。

同时,也测试了几种不同写法的row_number执行效果:

  1. declare @now datetime  
  2. --row_number 方案 
  3. select 'row_number 1 ' 方案 
  4. select @now=getdate()  
  5. select *from
  6. select top 200009 row_number()over(order by c_id)rn,* from t_um_ob_gprs_log 
  7. )t  
  8. where rn>199999  
  9.  
  10.  
  11. declare @row_numberDiff1 int 
  12. select @row_numberDiff1=datediff(ms,@now,getdate())  
  13. --row_number 方案 
  14. select 'row_number 2 ' 方案 
  15. select @now=getdate()  
  16. SELECT  TOP 10 * FROM ( 
  17. SELECT row_number() OVER(ORDER BY c_id) rn,* FROM t_um_ob_gprs_log 
  18. )t  
  19. WHERE rn >199999  
  20.  
  21.  
  22. declare @row_numberDiff2 int 
  23. select @row_numberDiff2=datediff(ms,@now,getdate()) --row_number 方案 
  24. select 'row_number 3 ' 方案 
  25. select @now=getdate()  
  26. SELECT   * FROM ( 
  27. SELECT row_number() OVER(ORDER BY c_id) rn,* FROM t_um_ob_gprs_log 
  28. )t  
  29. WHERE rn >=199999 AND rn<=200009  
  30.  
  31.  
  32.  
  33. declare @row_numberDiff3 int 
  34. select @row_numberDiff3=datediff(ms,@now,getdate())  
  35. --row_number 方案 
  36. select 'row_number 4 ' 方案 
  37. select @now=getdate()  
  38. select *from ( 
  39. select row_number()over(order by tc)rn,*from (select top 200009 0 AS tc,
  40. from t_um_ob_gprs_log ORDER BY c_id)t)tt  
  41. where rn>199999  
  42.  
  43.  
  44.  
  45. declare @row_numberDiff4 int 
  46. select @row_numberDiff4=datediff(ms,@now,getdate())  
  47.  
  48.  
  49. --记录结果 
  50. select '第199999 - 200009' as 页,@row_numberDiff1,@row_numberDiff2,
  51. @row_numberDiff3,@row_numberDiff4  

测试结果:(5次执行时间)

  1. 1)第199999 - 200009  106         110         80          93 
  2. 2)第199999 - 200009  93          110         93          80 
  3. 3)第199999 - 200009  123         96          76          76 
  4. 4)第199999 - 200009  173         93          76          80 
  5. 5)第199999 - 200009  203         76          80          76  

 

由此可见,后3种写法效率相差无几,第一种有明显的区别。

(michael-zhangyu)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201009/10163.html]
本文出处:博客园 作者:michael-zhangyu
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容