最近同事反應一個SQL用了 ROW_NUMBER() 後,
速度慢, CPU 吃很兇。而且也沒要很多資料呀 ~~~
怎麼會這樣子呢?
後來進去看才發現因為是使用 View ,而那個 View 將一堆的 Table 都先 join ,
這次的SQL是要取得每個 Group 的第一筆資料出來,
所以就使用 ROW_NUMBER() + Partition By 。
而原本的主 Table 資料很多,Filter 又寫在最後面,
所以 SQL 就先將所有的資料 Group 後給序號,最後再篩選出要的資料,並取得那些 Group 中的第一筆。
如果遇到類似的問題,可以先將資料篩選出來,這樣資料自然就少了,再去用 ROW_NUMBER() + Partition By 。
而且如果資料多的話,儘量不要使用 View ,這樣SQL可能會用不到對的 Index 哦!
當然這個是筆者遇到的狀況是如此,大家可以依實際上的狀況作調整,取得 平衡 點。
調整後如下,使用 Table 先 Filter ,最後再 ROW_NUMBER() + Partition By 。
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^