BUG #18588: Cannot force/let database use parallel execution in simple case. - Mailing list pgsql-bugs

From PG Bug reporting form
Subject BUG #18588: Cannot force/let database use parallel execution in simple case.
Date
Msg-id 18588-204730f9394441a8@postgresql.org
Whole thread Raw
Responses Re: BUG #18588: Cannot force/let database use parallel execution in simple case.
Re: BUG #18588: Cannot force/let database use parallel execution in simple case.
List pgsql-bugs
The following bug has been logged on the website:

Bug reference:      18588
Logged by:          Maxim Boguk
Email address:      maxim.boguk@gmail.com
PostgreSQL version: 15.6
Operating system:   Ubuntu
Description:

Hi,

I found very strange case when database simple do not use parallel plan in
trivial query (where it should provide huge benefit)
In the same time - if I add one not exists (subselect) the database execute
query in parallel mode (providing 8x speedup).

Initial query:
explain analyze select topic_id as y0_ from
public.negotiation_topic_archive_p005 this_ where
this_.employer_id='816144';

                      QUERY PLAN
                                                       

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Index Scan using negotiation_topic_archive_p005_employer_id_resume_id_idx
on negotiation_topic_archive_p005 this_  (cost=0.11..2501972.13 rows=505757
width=8) (actual time=0.020..699.322 rows=510040 loops=1)
   Index Cond: (employer_id = 816144)
 Planning Time: 0.132 ms
 Execution Time: 717.005 ms

setting 
set min_parallel_index_scan_size to '8kB';
                                         
set min_parallel_table_scan_size to '8kB';
set parallel_tuple_cost to 0;
set parallel_setup_cost to 0;

have no effect.

Even with the set force_parallel_mode to on - no effect:
negotiation_chat_archive=# explain analyze select topic_id as y0_ from
public.negotiation_topic_archive_p005 this_ where
this_.employer_id='816144';

                         QUERY PLAN
                                                             

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Gather  (cost=0.11..2501972.13 rows=505757 width=8) (actual
time=5.234..748.606 rows=510040 loops=1)
   Workers Planned: 1
   Workers Launched: 1
   Single Copy: true
   ->  Index Scan using
negotiation_topic_archive_p005_employer_id_resume_id_idx on
negotiation_topic_archive_p005 this_  (cost=0.11..2501972.13 rows=505757
width=8) (actual time=0.021..662.798 rows=510040 loops=1)
         Index Cond: (employer_id = 816144)
 Planning Time: 0.117 ms
 Execution Time: 768.117 ms


In the same time a bit more complicated query over the same data - happily
work in parallel (added AND NOT EXISTS (SELECT FROM applicant_black_list
WHERE this_.employer_id=applicant_black_list.employer_id AND
this_.applicant_id=applicant_black_list.applicant_id) condition):

explain analyze select topic_id as y0_ from
public.negotiation_topic_archive_p005 this_ where this_.employer_id='816144'
AND NOT EXISTS (SELECT FROM applicant_black_list WHERE
this_.employer_id=applicant_black_list.employer_id AND
this_.applicant_id=applicant_black_list.applicant_id);

                                QUERY PLAN
                                                                          

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Gather  (cost=10.27..2498445.60 rows=505754 width=8) (actual
time=1.452..106.335 rows=509901 loops=1)
   Workers Planned: 7
   Workers Launched: 7
   ->  Parallel Hash Anti Join  (cost=10.27..2498445.60 rows=72251 width=8)
(actual time=0.224..94.754 rows=63738 loops=8)
         Hash Cond: ((this_.employer_id = applicant_black_list.employer_id)
AND (this_.applicant_id = applicant_black_list.applicant_id))
         ->  Parallel Index Scan using
negotiation_topic_archive_p005_employer_id_resume_id_idx on
negotiation_topic_archive_p005 this_  (cost=0.11..2497637.07 rows=72251
width=16) (actual time=0.019..85.305 rows=63755 loops=8)
               Index Cond: (employer_id = 816144)
         ->  Parallel Hash  (cost=10.13..10.13 rows=2 width=8) (actual
time=0.027..0.027 rows=5 loops=8)
               Buckets: 1024  Batches: 1  Memory Usage: 40kB
               ->  Parallel Index Only Scan using employer_to_user_index on
applicant_black_list  (cost=0.08..10.13 rows=2 width=8) (actual
time=0.013..0.022 rows=41 loops=1)
                     Index Cond: (employer_id = 816144)
                     Heap Fetches: 5
 Planning Time: 2.550 ms
 Execution Time: 121.810 ms
(14 rows)

I feel something wrong there and I happy to assist debugging this issue (I
can use gdb with separated instance of the same data).
May be I missing some obvious restrictions but cannot find anything such in
documentation and speedup provided by parallel query would be enormous in my
case.

Kind Regards,
Maxim


pgsql-bugs by date:

Previous
From: Tom Lane
Date:
Subject: Re: Postgres v16.4 crashes on segfault when memory >= 16gb
Next
From: David Rowley
Date:
Subject: Re: BUG #18588: Cannot force/let database use parallel execution in simple case.