zoukankan      html  css  js  c++  java
  • SQL联查语句加上order排序之后速度超级慢

    项目中使用到了分页查询,形式如下

    1 select * from
    2 (
    3     select row_number() over (order by a.id0) as seq,a.* from
    4     PMS_T_D_StakeCoordinate a
    5     left join ZY_T_D_Route b on a.route_code=b.route_code    
    6 ) as T
    7 where seq between 1 and 1000

    本来分页查询应该是很快的,但是随着项目的进展,数据量逐步增加到了百万级,此查询直接报错“服务器连接超时”

    于是将SQL考到SqlServer里面执行,发现需要2分多钟才能出结果

    去掉“row_number() over (order by id0) as seq”之后时间减少到了15秒,这个差距太大了。。。

    于是猜测是order by 的问题,在查询后面加上order by id0,查询时间又飙到了2分钟,果然如此

    于是,寻求加自增长编号的方法替代order by

    select IDENTITY(INT,1,1) as orderID,* 
     into #ttemp
    from
     
    (
     
       table...
     
    ) where seq between pageBegin and pageEnd
    
    select * from #ttemp

    但是这里也有个问题,通过自增IDENTITY(INT,1,1)得到的orderID不是按顺序排列的,这个地方没搞清楚,求解求指点??????

    不得已,在select * from #ttemp后面再order by一次,如下

    select * from #ttemp  order by orderID

    这个担心用order by又会导致查询时间飙升,但结果也只花了16秒,nice!

    如此看来,order by对单表影响不大,可能是因为我的查询中有太多的联查???

  • 相关阅读:
    Ansible概述
    iptables端口转发
    iptables配置实例
    iptables常用操作
    iptables常用命令
    每日总结3.15
    每日总结3.12
    每日总结3.11
    每日总结3.10
    每日总结3.9
  • 原文地址:https://www.cnblogs.com/lyd2016/p/7093305.html
Copyright © 2011-2022 走看看