Re: Parallel Query
Luís Roberto Weck <[email protected]> Wed, 13 Nov 2019 18:04:42 -0300
| Newsgroups | gmane.comp.db.postgresql.performance |
|---|---|
| Message-ID | <[email protected]> |
**** Em 13/11/2019 17:47, Tomas Vondra escreveu: > On Wed, Nov 13, 2019 at 05:16:44PM -0300, Luís Roberto Weck wrote: >> Hi! >> >> Is there a reason query 3 can't use parallel workers? Using q1 and q2 >> they seem very similar but can use up to 4 workers to run faster: >> >> q1: https://pastebin.com/ufkbSmfB >> q2: https://pastebin.com/Yt32zRNX >> q3: https://pastebin.com/dqh7yKPb >> >> The sort node on q3 takes almost 12 seconds, making the query run on >> 68 if I had set enough work_mem to make it all in memory. >> > > Most likely because it'd be actually slower. The trouble is the > aggregation does not actually reduce the cardinality, or at least the > planner does not expect that - the Sort and GroupAggregate are expected > to produce 3454539 rows. The last step of the aggregation has to receive > and merge data from all workers, which is not exactly free, and if there > is no reduction of cardinality it's likely cheaper to just do everything > in a single process serially. > > How does the explain analyze output look like without the HAVING clause? > > Try setting parallel_setup_cost and parallel_tuple_cost to 0. That might > trigger parallel query. > > regards > Tomas, EXPLAIN: Group (cost=1245130.37..1279676.46 rows=3454609 width=14) Group Key: c.concod, cp.conparnum, cp.conpardatven -> Sort (cost=1245130.37..1253766.89 rows=3454609 width=14) Sort Key: c.concod, cp.conparnum, cp.conpardatven -> Hash Join (cost=34366.64..869958.26 rows=3454609 width=14) Hash Cond: (cp.concod = c.concod) -> Seq Scan on contrato_parcela cp (cost=0.00..804245.73 rows=11941273 width=14) -> Hash (cost=23436.55..23436.55 rows=874407 width=8) -> Index Only Scan using contrato_iu0004 on contrato c (cost=0.43..23436.55 rows=874407 width=8) Index Cond: (carcod = 100) EXPLAIN ANALYZE: Group (cost=1245132.29..1279678.44 rows=3454615 width=14) (actual time=61860.985..64852.579 rows=6787445 loops=1) Group Key: c.concod, cp.conparnum, cp.conpardatven -> Sort (cost=1245132.29..1253768.83 rows=3454615 width=14) (actual time=61860.980..63128.557 rows=6787531 loops=1) Sort Key: c.concod, cp.conparnum, cp.conpardatven Sort Method: external merge Disk: 172688kB -> Hash Join (cost=34366.64..869959.48 rows=3454615 width=14) (actual time=876.428..52675.140 rows=6787531 loops=1) Hash Cond: (cp.concod = c.concod) -> Seq Scan on contrato_parcela cp (cost=0.00..804246.91 rows=11941291 width=14) (actual time=0.010..44860.242 rows=11962505 loops=1) -> Hash (cost=23436.55..23436.55 rows=874407 width=8) (actual time=874.791..874.791 rows=879841 loops=1) Buckets: 1048576 Batches: 1 Memory Usage: 42561kB -> Index Only Scan using contrato_iu0004 on contrato c (cost=0.43..23436.55 rows=874407 width=8) (actual time=0.036..535.897 rows=879841 loops=1) Index Cond: (carcod = 100) Heap Fetches: 144438 Planning time: 1.252 ms Execution time: 65214.007 ms Indeed, reducing the costs made the query run in parallel, but the improvement in speed was not worth the cost (CPU).