Re: Parallel Query
Luís Roberto Weck <[email protected]> Wed, 13 Nov 2019 18:07:16 -0300
| Newsgroups | gmane.comp.db.postgresql.performance |
|---|---|
| Message-ID | <[email protected]> |
**** Em 13/11/2019 17:40, Jeff Janes escreveu: > On Wed, Nov 13, 2019 at 3:11 PM Luís Roberto Weck > <[email protected] <mailto:[email protected]>> 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. > > > The third one thinks it is going find 3454539 output rows. If it run > in parallel, it thinks it will be passing lots of rows up from the > parallel workers, and charges a high price (parallel_tuple_cost = 0.1) > for doing so. So you can try lowering parallel_tuple_cost, or > figuring out why the estimate is so bad. > > Cheers, > > Jeff Hi Jeff, I don't think the "HAVING" clause is havin any effect on the estimates: WITHOUT "HAVING": Group (cost=1245134.08..1279680.28 rows=3454620 width=14) Group Key: c.concod, cp.conparnum, cp.conpardatven -> Sort (cost=1245134.08..1253770.63 rows=3454620 width=14) Sort Key: c.concod, cp.conparnum, cp.conpardatven -> Hash Join (cost=34366.64..869960.70 rows=3454620 width=14) Hash Cond: (cp.concod = c.concod) -> Seq Scan on contrato_parcela cp (cost=0.00..804248.08 rows=11941308 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) WITH "HAVING": GroupAggregate (cost=1245144.88..1322874.51 rows=3454650 width=14) Group Key: c.concod, cp.conparnum, cp.conpardatven Filter: (count(*) > 1) -> Sort (cost=1245144.88..1253781.51 rows=3454650 width=14) Sort Key: c.concod, cp.conparnum, cp.conpardatven -> Hash Join (cost=34366.64..869968.02 rows=3454650 width=14) Hash Cond: (cp.concod = c.concod) -> Seq Scan on contrato_parcela cp (cost=0.00..804255.13 rows=11941413 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) Maybe PostgreSQL can't find a way to calculate having estimates?