Subquery 在資料量不大時很好用,但是遇到主 query 有成千上萬筆資料時,速度就嚴重慢下來了, 狀況類似 N+1 Select。
select .... (select sum(...) from ...) ... from ... ;
第一個改善方式就是將 subquery 打掉,改用 join 取代。
select ... sum(...) ... from ... join ... ;
但是萬一遇到無法以 join 取代 subquery 時,這時候就要拿記憶體來換了。
先執行 subquery,以 map 形式組裝 subquery 得到的資料,再執行主 query,取得主 query 回傳的 data ,再逐筆到 subquery map 中取得對應的資料。
select ... sum(...) ... from ... group by ...;
select ... from ... ;
改進 SQL 效能的一個準則就是:盡量減少下 sql 的次數,包括 subquery。
在上述 map 案例中,切勿在 loop 主 query 的 data 中才下 subquery,這樣會造成 N+1 Select。
沒有留言:
張貼留言