For the record, here is a comparison of explain plans simulating the sub-select 
used in the patch and a full JOIN against account_account. The actual times are 
those of a sample database with 1071 account_move_lines in account 838.
It seems the sub-select is a bit cheaper than the full-blown join, both in the 
estimated and actual costs:


# -- SUB-SELECT VERSION
# explain analyze select (SELECT CASE WHEN currency_id IS NULL THEN 0 ELSE 
COALESCE(SUM(l.amount_currency), 0) END FROM account_account WHERE id IN 
(l.account_id)) as foreign_balance from account_move_line l where l.account_id 
= 838 group by l.account_id;
                                                                      QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------
 GroupAggregate  (cost=9.45..525.70 rows=2 width=20) (actual time=3.715..3.715 
rows=1 loops=1)
   ->  Bitmap Heap Scan on account_move_line l  (cost=9.45..507.98 rows=154 
width=20) (actual time=0.357..2.824 rows=1071 loops=1)
         Recheck Cond: (account_id = 838)
         ->  Bitmap Index Scan on account_move_line_account_id_index  
(cost=0.00..9.41 rows=154 width=0) (actual time=0.248..0.248 rows=1205 loops=1)
               Index Cond: (account_id = 838)
   SubPlan 1
     ->  Index Scan using account_account_pkey on account_account  
(cost=0.00..8.27 rows=1 width=4) (actual time=0.023..0.024 rows=1 loops=1)
           Index Cond: (id = $2)
 Total runtime: 3.781 ms
(9 rows)


# -- JOIN VERSION
# explain analyze select CASE WHEN a.currency_id is null then 0 else 
COALESCE(SUM(l.amount_currency), 0) end as foreign_balance from 
account_move_line l join account_account a on (l.account_id = a.id) where 
l.account_id = 838 group by a.id, a.currency_id;
                                                                         QUERY 
PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=519.33..519.34 rows=1 width=24) (actual time=3.958..3.958 
rows=1 loops=1)
   ->  Nested Loop  (cost=9.45..517.79 rows=154 width=24) (actual 
time=0.373..3.201 rows=1071 loops=1)
         ->  Index Scan using account_account_pkey on account_account a  
(cost=0.00..8.27 rows=1 width=8) (actual time=0.026..0.028 rows=1 loops=1)
               Index Cond: (id = 838)
         ->  Bitmap Heap Scan on account_move_line l  (cost=9.45..507.98 
rows=154 width=20) (actual time=0.341..2.716 rows=1071 loops=1)
               Recheck Cond: (l.account_id = 838)
               ->  Bitmap Index Scan on account_move_line_account_id_index  
(cost=0.00..9.41 rows=154 width=0) (actual time=0.233..0.233 rows=1205 loops=1)
                     Index Cond: (l.account_id = 838)
 Total runtime: 4.029 ms
(9 rows)



PS: the "id IN (l.account_id))" in the merge proposal is a bit weird and should 
have been written as "id = l.account_id"
-- 
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-bug-922621-mdi/+merge/91206
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openobject-addons/trunk-bug-922621-mdi.

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to