項目中使用到了分頁查詢,形式如下
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對單表影響不大,可能是因為我的查詢中有太多的聯查???