• 百万数据下几种SQL性能测试


    今天闲来学习了一下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列索引

    Top

    Max/Top

    row_number()

    无索引

    cpu

    reads

    duration

    0

    893

    65

    cpu

    reads

    duration

    0

    590

    70

    cpu

    reads

    duration

    0

    512

    67

    聚焦索引

    cpu

    reads

    duration

    0

    37

    66

    cpu

    reads

    duration

    0

    98

    64

    cpu

    reads

    duration

    0

    28

    67

    非聚焦索引

    cpu

    reads

    duration

    0

    895

    63

    cpu

    reads

    duration

    0

    592

    66

    cpu

    reads

    duration

    0

    514

    66

    结论:

    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列索引

    in

    union

    or

    无索引

    cpu

    reads

    duration

    0

    37

    54

    cpu

    reads

    duration

    0

    58

    104

    cpu

    reads

    duration

    0

    41

    56

    聚焦索引

    cpu

    reads

    duration

    0

    44

    54

    cpu

    reads

    duration

    0

    54

    58

    cpu

    reads

    duration

    0

    40

    54

    非聚焦索引

    cpu

    reads

    duration

    0

    43

    53

    cpu

    reads

    duration

    16

    61

    62

    cpu

    reads

    duration

    0

    43

    54

     

    结论:

    1)  网上很多资料说union的性能要高于in/or,但从我这测试的结果来看,不论是有无索引,union的性能都是最低的?不知是何原因?

    2)  网上流传mssql会自己把in解析成or查询,从这份测试结果来看,貌似不假!

    3)  虽然in/or会引起全表扫描,但别无选择的情况下也是是能胜任很多工作的。

    第一次分享技术类的文章,写的不好欢迎拍砖,谢谢!

    http://www.vhaoxue.com

  • 相关阅读:
    GMap.NET开发技巧 开发可以根据地图放大缩小而缩放的图元
    GPS定位数据库表设计
    基于WCF回调(WCF Callback)的GPS报警推送(带源码)
    基于部标JT/T 808协议及数据格式的GPS服务器 开发
    如何做好GPS平台软硬件集成测试
    框架内思维 创新更有力
    JT/T 808 809 部标认证流程和申报材料下载
    基于部标JT/T8092011的(已过检)GPS平台数据交换及转发服务器
    基于Spring.NET的MVC应用程序发布时的虚拟路径错误的解决方案
    javascript组件开发方式(转载)
  • 原文地址:https://www.cnblogs.com/shaocan/p/2783116.html
Copyright © 2020-2023  润新知