Re: speeding up planning with partitions

Amit Langote <langote_amit_f8@lab.ntt.co.jp>

From: Amit Langote <Langote_Amit_f8@lab.ntt.co.jp>
To: "Imai, Yoshikazu" <imai.yoshikazu@jp.fujitsu.com>, Amit Langote <amitlangote09@gmail.com>
Cc: Alvaro Herrera <alvherre@2ndquadrant.com>, David Rowley <david.rowley@2ndquadrant.com>, Pg Hackers <pgsql-hackers@postgresql.org>
Date: 2019-02-08T09:12:34Z
Lists: pgsql-hackers

Attachments

Imai-san,

Thanks for the comments.

On 2019/02/08 13:44, Imai, Yoshikazu wrote:
> 3.
> 0001: line 1919-1920
> 
> -		case CONSTRAINT_EXCLUSION_ON:
> -			break;				/* always try to exclude */
> 
> CONSTRAINT_EXCLUSION_ON is no longer used, so should we remove it also from guc parameters?

Well, we haven't removed the "on" setting itself.

> 4.
> 0001:
> 
> Can we remove enum InheritanceKind which is no longer used?

That we can do.

> I also see the patch from a perspective of separating codes from 0001 which are not essential of Overhaul inheritance update/delete planning. Although almost all of codes are related each other, but I found below two things can be moved to another patch.
> 
> ---
> 0001: line 550-608
> 
> This section seems to be just refinement of set_append_rel_size().
> So can we separate this from 0001 to another patch?
> 
> ---
> 0001: line 812-841, 940-947, 1525-1536, 1938-1947 
> 
> These codes are related to removement of InheritanceKind from relation_excluded_by_constraints(), so I think it is something like cleaning of unneeded codes. Can we separate this to patch as some-code-clearnups-of-0001.patch? Of course, we can do that only if removing of these codes from 0001 would not bother success of "make check" of 0001.
> I also think that what I pointed out at above 3. and 4. can also be included in some-code-clearnups-of-0001.patch.

Okay, I've broken down those changes into separate patches, so that
cleanup hunks are not fixed with other complex changes.

0001 is now a patch to remove duplicate code from set_append_rel_size.  It
combines multiple blocks that have the same body doing
set_dummy_rel_pathlist().

0002 is the "overhaul inherited update/delete planning"

0003 is a cleanup patch that gets rid of some code that is rendered
useless due to 0002 (partitioned tables no longer use constraint exclusion)

I think 0001 can be committed on its own.  0002+0003 can be committed
together.

0004-0006 are the patches that were previously 0002-0004.

The new version also contains a change to what was previously 0001 patch
(attached 0002) -- eq_classes is now copied right when the child subroot
is created, that is, in create_inherited_target_child_root(), no longer in
the loop in set_inherit_target_rel_sizes().

Thanks,
Amit

Commits

  1. Clean up handling of constraint_exclusion and enable_partition_pruning.

  2. Add test case exercising formerly-unreached code in inheritance_planner.

  3. Speed up planning when partitions can be pruned at plan time.

  4. Avoid crash in partitionwise join planning under GEQO.

  5. Avoid passing query tlist around separately from root->processed_tlist.

  6. Build "other rels" of appendrel baserels in a separate step.

  7. Get rid of duplicate child RTE for a partitioned table.

  8. Rearrange make_partitionedrel_pruneinfo to avoid work when we can't prune.

  9. Don't copy PartitionBoundInfo in set_relation_partition_info.

  10. Move building of child base quals out into a new function

  11. Reorganize planner code moved in b60c39759908

  12. Move inheritance expansion code into its own file

  13. Fix inherited UPDATE/DELETE with UNION ALL subqueries.

  14. Rearrange planner to save the whole PlannerInfo (subroot) for a subquery.