开发者社区> 问答> 正文

随便看看 -百万数据下几种SQL性能简单测试


 测试环境:90W,单条记录约3KB,数据库:MSSQL2005
  测试前清除缓存
  DBCC FREEPROCCACHE DBCC DROPCLEANBUFFERS
   一、翻页性能测试
  1、Top
  select top 10 * from message where id not in (select top 20 id frommessage where classid=77 order by id desc ) and classid=77 order by id desc
  2、Max/Top
  select top 10 * from message where id <(select min(id) from messagewhere id in(select top 20 id from message where classid=77 order by iddesc) ) and classid=77 order by id desc
  3、row_number
  select top 10 * from (select row_number()over(order by id desc) rownumber,*from message where classid=77)a where classid=77 and rownumber>20
  MsSql翻页性能测试
  ID列索引TopMax/Toprow_number()
  无索引CPUreadsduration
  089365
  cpureadsduration
  059070
  cpureadsduration
  051267
  聚焦索引cpureadsduration
  03766
  cpureadsduration
  09864
  cpureadsduration
  02867
  非聚焦索引cpureadsduration
  089563
  cpureadsduration
  059266
  cpureadsduration
  051466
  结论:
  1)从以上测试结果可以看出,不论是否索引排序字段,也不管是何种索引,row_number都能得到最高的性能,其次Max/Top的方式测试性能也不错。
  2)在使用非聚焦索引的情况下,性能并无任何提示,甚至要慢于无索引的情况,可能是因为SQL先要去查找索引表,然后根据索引结果再去查找实体表,在这过程浪费了资源。
  3)聚焦索引也的正确应用才能发挥其该有的优势啊!
  综合结果:row_number> max/top > top
  二、in、or、union关键字性能测试
  介于网上有很多关于in/or/union等关键字的性能讨论,本人也小试了一把,测试结果如下。
  1、in
  select * from video where id in(100,101,102,103,104,105,106,107,108,109)
  2、union
  select * from video where id =100 union all select * from video where id =101 union all select * from video where id =102 union all select * from video where id =103 union all select * from video where id =104 union all select * from video where id =105 union all select * from video where id =106 union all select * from video where id =107 union all select * from video where id =108 union all select * from video where id =109
  3、or
  select * from video where id=100 or id=101 or id=102 or id=103or id=104 or id=105 or id=106 or id=107 or id=108 or id=109
  in PK or PK union
  ID列索引inunionor
  无索引cpureadsduration
  03754
  cpureadsduration
  058104
  cpureadsduration
  04156
  聚焦索引cpureadsduration
  04454
  cpureadsduration
  05458
  cpureadsduration
  04054
  非聚焦索引cpureadsduration
  04353
  cpureadsduration
  166162
  cpureadsduration
  04354
   结论:
  1) 网上很多资料说union的性能要高于in/or,但从我这测试的结果来看,不论是有无索引,union的性能都是最低的?不知是何原因?
  2) 网上流传mssql会自己把in解析成or查询,从这份测试结果来看,貌似不假!
  3) 虽然in/or会引起全表扫描,但别无选择的情况下也是是能胜任很多工作的。

展开
收起
holdb 2014-08-11 00:02:08 6122 0
4 条回答
写回答
取消 提交回答
  • 顶一个~
    2014-08-13 22:55:25
    赞同 展开评论 打赏
  • Re随便看看百万数据下几种SQL性能简单测试
    嗯,拿数据说话最有说服力。
    2014-08-11 11:41:39
    赞同 展开评论 打赏
  • Re随便看看百万数据下几种SQL性能简单测试
    牛!!

    看我签名!
    2014-08-11 10:52:30
    赞同 展开评论 打赏
  • 太牛叉了!!!!
    2014-08-11 09:19:41
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server在电子商务中的应用与实践 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载