Re: [HACKERS] why not parallel seq scan for slow functions
Amit Kapila <amit.kapila16@gmail.com>
From: Amit Kapila <amit.kapila16@gmail.com>
To: Robert Haas <robertmhaas@gmail.com>
Cc: Marina Polyakova <m.polyakova@postgrespro.ru>, pgsql-hackers <pgsql-hackers@postgresql.org>,
Jeff Janes <jeff.janes@gmail.com>, Thomas Munro <thomas.munro@enterprisedb.com>,
Amit Khandekar <amitdkhan.pg@gmail.com>, Dilip Kumar <dilipbalaut@gmail.com>,
Michael Paquier <michael.paquier@gmail.com>
Date: 2018-01-29T03:13:59Z
Lists: pgsql-hackers
On Sat, Jan 27, 2018 at 2:50 AM, Robert Haas <robertmhaas@gmail.com> wrote: > On Tue, Jan 2, 2018 at 6:38 AM, Amit Kapila <amit.kapila16@gmail.com> wrote: >> [ new patch ] > > I think that grouping_planner() could benefit from a slightly more > extensive rearrangement. With your patch applied, the order of > operations is: > > 1. compute the scan/join target > 2. apply the scan/join target to all paths in current_rel's pathlist > 3. generate gather paths, possibly adding more stuff to current_rel's pathlist > 4. rerun set_cheapest > 5. apply the scan/join target, if parallel safe, to all paths in the > current rel's partial_pathlist, for the benefit of upper planning > steps > 6. clear the partial pathlist if the target list is not parallel safe > > I at first thought this was outright broken because step #3 imposes > the scan/join target without testing it for parallel-safety, but then > I realized that generate_gather_paths will apply that target list by > using apply_projection_to_path, which makes an is_parallel_safe test > of its own. But it doesn't seem good for step 3 to test the > parallel-safety of the target list separately for each path and then > have grouping_planner do it one more time for the benefit of upper > planning steps. Instead, I suggest that we try to get rid of the > logic in apply_projection_to_path that knows about Gather and Gather > Merge specifically. I think we can do that if grouping_planner does > this: > > 1. compute the scan/join target > 2. apply the scan/join target, if parallel safe, to all paths in the > current rel's partial_pathlist > 3. generate gather paths > 4. clear the partial pathlist if the target list is not parallel safe > 5. apply the scan/join target to all paths in current_rel's pathlist > 6. rerun set_cheapest > > That seems like a considerably more logical order of operations. It > avoids not only the expense of testing the scanjoin_target for > parallel-safety multiple times, but the ugliness of having > apply_projection_to_path know about Gather and Gather Merge as a > special case. > If we want to get rid of Gather (Merge) checks in apply_projection_to_path(), then we need some way to add a projection path to the subpath of gather node even if that is capable of projection as we do now. I think changing the order of applying scan/join target won't address that unless we decide to do it for every partial path. Another way could be that we handle that in generate_gather_paths, but I think that won't be the idle place to add projection. If we want, we can compute the parallel-safety of scan/join target once in grouping_planner and then pass it in apply_projection_to_path to address your main concern. -- With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com
Commits
-
Rewrite the code that applies scan/join targets to paths.
- 11cf92f6e2e1 11.0 landed
-
Teach create_projection_plan to omit projection where possible.
- d7c19e62a8e0 11.0 landed
-
Make the upper part of the planner work by generating and comparing Paths.
- 3fc6e2d7f5b6 9.6.0 cited