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对单表影响不大,可能是因为我的查询中有太多的联查???

原文地址:https://www.cnblogs.com/lyd2016/p/7093305.html