2011-02-09

移除 Subquery 以提昇 SQL 效能

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。

沒有留言:

張貼留言