Hello,

We’re trying to debug a performance issue affecting our staging database, and 
we’ve narrowed it down to a difference in the query optimizer in 9.5.2. 
Upgrading to 9.5 is important for us because we need the ability to import 
foreign schemas.

This is the query we’re running:

CREATE TEMP TABLE tmp_joined_transactions_9gkgptn5xcp9 ( transaction_id integer 
PRIMARY KEY );

INSERT INTO tmp_joined_transactions_9gkgptn5xcp9 (transaction_id)
SELECT DISTINCT ON ("transactions_transaction"."id") 
"transactions_transaction"."id"
FROM "transactions_transaction" , "tmp_joined_transactions_75chlsokrsev"
WHERE (NOT ("transactions_transaction"."id"
IN (SELECT U0."id" AS Col1
FROM "transactions_transaction" U0
LEFT OUTER JOIN "transactions_commission" U1
ON ( U0."id" = U1."transaction_id" )
WHERE U1."id" IS NULL))
AND "transactions_transaction"."date_created" >= '2010-01-01'::date
AND "transactions_transaction"."date_created" <= '2015-12-31'::date
AND "transactions_transaction"."deal_status" IN (1)
AND (transactions_transaction.id = 
tmp_joined_transactions_75chlsokrsev.transaction_id))
ORDER BY "transactions_transaction"."id" ASC;

And this is the EXPLAIN ANALYZE output in 9.5.2:

Insert on tmp_joined_transactions_9gkgptn5xcp9  (cost=42111.29..42991.60 rows=1 
width=4) (actual time=470236.029..470236.029 rows=0 loops=1)
  ->  Unique  (cost=42111.29..42991.59 rows=1 width=4) (actual 
time=1109.636..470222.609 rows=4652 loops=1)
        ->  Nested Loop  (cost=42111.29..42991.59 rows=1 width=4) (actual 
time=1109.635..470219.259 rows=4652 loops=1)
              Join Filter: (transactions_transaction.id = 
tmp_joined_transactions_75chlsokrsev.transaction_id)
              Rows Removed by Join Filter: 1153472704
              ->  Index Only Scan using 
tmp_joined_transactions_75chlsokrsev_pkey on 
tmp_joined_transactions_75chlsokrsev  (cost=0.28..224.61 rows=5355 width=4) 
(actual time=0.016..4.829 rows=4652 loops=1)
                    Heap Fetches: 4652
              ->  Materialize  (cost=42111.01..42686.66 rows=1 width=4) (actual 
time=0.240..51.639 rows=247953 loops=4652)
                    ->  Bitmap Heap Scan on transactions_transaction  
(cost=42111.01..42686.65 rows=1 width=4) (actual time=1109.580..1238.034 
rows=247953 loops=1)
                          Recheck Cond: ((date_created >= '2010-01-01'::date) 
AND (date_created <= '2015-12-31'::date))
                          Filter: ((NOT (hashed SubPlan 1)) AND (deal_status = 
1))
                          Rows Removed by Filter: 21068
                          Heap Blocks: exact=8073
                          ->  Bitmap Index Scan on 
transactions_transaction_c69e55a4  (cost=0.00..18.02 rows=161 width=0) (actual 
time=20.153..20.153 rows=269021 loops=1)
                                Index Cond: ((date_created >= 
'2010-01-01'::date) AND (date_created <= '2015-12-31'::date))
                          SubPlan 1
                            ->  Hash Right Join  (cost=8799.57..42092.98 rows=1 
width=4) (actual time=852.012..1086.671 rows=3395 loops=1)
                                  Hash Cond: (u1.transaction_id = u0.id)
                                  Filter: (u1.id IS NULL)
                                  Rows Removed by Filter: 995248
                                  ->  Seq Scan on transactions_commission u1  
(cost=0.00..27020.63 rows=1039763 width=8) (actual time=0.003..221.750 
rows=1039763 loops=1)
                                  ->  Hash  (cost=8395.92..8395.92 rows=32292 
width=4) (actual time=153.984..153.984 rows=272663 loops=1)
                                        Buckets: 131072 (originally 32768)  
Batches: 4 (originally 1)  Memory Usage: 3425kB
                                        ->  Seq Scan on 
transactions_transaction u0  (cost=0.00..8395.92 rows=32292 width=4) (actual 
time=0.003..71.988 rows=272663 loops=1)
Planning time: 0.410 ms
Execution time: 470237.400 ms

And this is the EXPLAIN ANALYZE output in 9.4.5:

Insert on tmp_joined_transactions_9gkgptn5xcp9  (cost=88544.31..88576.62 
rows=2154 width=4) (actual time=1356.065..1356.065 rows=0 loops=1)
  ->  Unique  (cost=88544.31..88555.08 rows=2154 width=4) (actual 
time=1347.480..1350.548 rows=4715 loops=1)
        ->  Sort  (cost=88544.31..88549.70 rows=2154 width=4) (actual 
time=1347.477..1348.432 rows=4715 loops=1)
              Sort Key: transactions_transaction.id
              Sort Method: quicksort  Memory: 414kB
              ->  Hash Join  (cost=72700.01..88425.06 rows=2154 width=4) 
(actual time=1107.077..1345.650 rows=4715 loops=1)
                    Hash Cond: (transactions_transaction.id = 
tmp_joined_transactions_75chlsokrsev.transaction_id)
                    ->  Seq Scan on transactions_transaction  
(cost=72565.61..87199.11 rows=122287 width=4) (actual time=1104.855..1269.783 
rows=251736 loops=1)
                          Filter: ((NOT (hashed SubPlan 1)) AND (date_created 
>= '2010-01-01'::date) AND (date_created <= '2015-12-31'::date) AND 
(deal_status = 1))
                          Rows Removed by Filter: 34441
                          SubPlan 1
                            ->  Hash Right Join  (cost=16466.94..72565.61 
rows=1 width=4) (actual time=887.763..1103.391 rows=3551 loops=1)
                                  Hash Cond: (u1.transaction_id = u0.id)
                                  Filter: (u1.id IS NULL)
                                  Rows Removed by Filter: 1047414
                                  ->  Seq Scan on transactions_commission u1  
(cost=0.00..28019.85 rows=1073685 width=8) (actual time=0.004..360.549 
rows=1072675 loops=1)
                                  ->  Hash  (cost=11771.75..11771.75 
rows=286175 width=4) (actual time=167.675..167.675 rows=286177 loops=1)
                                        Buckets: 16384  Batches: 4  Memory 
Usage: 2528kB
                                        ->  Seq Scan on 
transactions_transaction u0  (cost=0.00..11771.75 rows=286175 width=4) (actual 
time=0.002..84.517 rows=286177 loops=1)
                    ->  Hash  (cost=71.40..71.40 rows=5040 width=4) (actual 
time=2.202..2.202 rows=4715 loops=1)
                          Buckets: 1024  Batches: 1  Memory Usage: 166kB
                          ->  Seq Scan on tmp_joined_transactions_75chlsokrsev  
(cost=0.00..71.40 rows=5040 width=4) (actual time=0.009..0.983 rows=4715 
loops=1)
Planning time: 0.448 ms
Execution time: 1356.648 ms

The query is slower in 9.5.2 by several orders of magnitude (1300 ms vs 470000 
ms).

Does anyone know if there is a way to modify our query to guide the query 
optimizer back in the right direction?

Thank you for your assistance,
Markus Erdmann

Reply via email to