專案中使用到了分頁查詢,形式如下
1select
*from2(
3select row_number() over (order
by a.id0) as seq,a.*
from
4pms_t_d_stakecoordinate a
5left
join zy_t_d_route b on a.route_code=
b.route_code
6 ) ast7
where seq between
1and
1000
本來分頁查詢應該是很快的,但是隨著專案的進展,資料量逐步增加到了百萬級,此查詢直接報錯「伺服器連線超時」
於是將sql考到sqlserver裡面執行,發現需要2分多鐘才能出結果
去掉「row_number() over (order by id0) as seq」之後時間減少到了15秒,這個差距太大了。。。
於是猜測是order by 的問題,在查詢後面加上order by id0,查詢時間又飆到了2分鐘,果然如此
於是,尋求加自增長編號的方法替代order by
selectidentity(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對單錶影響不大,可能是因為我的查詢中有太多的聯查???
sql語句 關聯查詢
1,關聯查詢 sql中多個left join,為了保證返回數量和主表一樣,要加個group by 主表id 2,if,ifnull,concat ws等常見方法 1 concat ws country,province,city region 三欄位按照 之間的內容合拼 concat ws case...
SQL語句三表聯查
首先啊,了解一下左右內連線都是什麼意思,我目前理解的就是,左連線就是把左表的東西都顯示出來,右表也是同理,內連線就是顯示兩個表共同的內容。現在有基礎知識了開始後續。首先這次我用的表是他們仨 先來乙個雙表查詢 左連線 left join 左邊是左表也就是你全查詢出來的表,右邊的聯查的第二張表。on是他...
三 複雜sql語句之多表聯查
像這種sql語句的核心是 建立目標字段之間的關係對映表,中間依靠各種中間臨時表來搭建 複雜sql語句 update business b,建立商戶與星級的對應關係表 select o.business id,sum a.star totalstar,count totalcomment from o...