資料多時,使用複雜的 View 請小心 (Join 一堆 Table 的大 View)

最近同事反應一個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:從零開始的軟體開發生活

請大家繼續支持 ^_^