Improving Inner Join Performance - Mailing list pgsql-performance

From Andy
Subject Improving Inner Join Performance
Date
Msg-id 001d01c6120b$0d783600$0b00a8c0@forge
Whole thread Raw
Responses Re: Improving Inner Join Performance  (Frank Wiles <frank@wiles.org>)
Re: Improving Inner Join Performance  (Pandurangan R S <pandurangan.r.s@gmail.com>)
List pgsql-performance
Hi to all,
 
I have the following query:
 
SELECT count(*) FROM orders o
      INNER JOIN report r ON r.id_order=o.id
      WHERE o.id_status>3
 
Explaing analyze:
Aggregate  (cost=8941.82..8941.82 rows=1 width=0) (actual time=1003.297..1003.298 rows=1 loops=1)
  ->  Hash Join  (cost=3946.28..8881.72 rows=24041 width=0) (actual time=211.985..951.545 rows=72121 loops=1)
        Hash Cond: ("outer".id_order = "inner".id)
        ->  Seq Scan on report r  (cost=0.00..2952.21 rows=72121 width=4) (actual time=0.005..73.869 rows=72121 loops=1)
        ->  Hash  (cost=3787.57..3787.57 rows=24682 width=4) (actual time=211.855..211.855 rows=0 loops=1)
              ->  Seq Scan on orders o  (cost=0.00..3787.57 rows=24682 width=4) (actual time=0.047..147.170 rows=72121 loops=1)
                    Filter: (id_status > 3)
Total runtime: 1003.671 ms
 
 
I could use it in the following format, because I have to the moment only the 4,6 values for the id_status.
 
SELECT count(*) FROM orders o
      INNER JOIN report r ON r.id_order=o.id
      WHERE o.id_status IN (4,6)
 
Explain analyze:
Aggregate  (cost=5430.04..5430.04 rows=1 width=0) (actual time=1472.877..1472.877 rows=1 loops=1)
  ->  Hash Join  (cost=2108.22..5428.23 rows=720 width=0) (actual time=342.080..1419.775 rows=72121 loops=1)
        Hash Cond: ("outer".id_order = "inner".id)
        ->  Seq Scan on report r  (cost=0.00..2952.21 rows=72121 width=4) (actual time=0.036..106.217 rows=72121 loops=1)
        ->  Hash  (cost=2106.37..2106.37 rows=739 width=4) (actual time=342.011..342.011 rows=0 loops=1)
              ->  Index Scan using orders_id_status_idx, orders_id_status_idx on orders o  (cost=0.00..2106.37 rows=739 width=4) (actual time=0.131..268.397 rows=72121 loops=1)
                    Index Cond: ((id_status = 4) OR (id_status = 6))
Total runtime: 1474.356 ms
How can I improve this query's performace?? The ideea is to count all the values that I have in the database for the following conditions. If the users puts in some other search fields on the where then the query runs faster but in this format sometimes it takes a lot lot of time(sometimes even 2,3 seconds).
 
Can this be tuned somehow???
 
Regards,
Andy.
 
 

pgsql-performance by date:

Previous
From: Markus Schaber
Date:
Subject: Re: Invulnerable VACUUM process thrashing everything
Next
From: Markus Schaber
Date:
Subject: Re: What's the best hardver for PostgreSQL 8.1?