Re: speeding up planning with partitions
Amit Langote <amitlangote09@gmail.com>
Attachments
- v19-0004-Do-not-lock-all-partitions-at-the-beginning.patch (application/octet-stream) patch v19-0004
- v19-0002-Lazy-creation-of-RTEs-for-inheritance-children.patch (application/octet-stream) patch v19-0002
- v19-0003-Teach-planner-to-only-process-unpruned-partition.patch (application/octet-stream) patch v19-0003
- v19-0001-Overhaul-inheritance-update-delete-planning.patch (application/octet-stream) patch v19-0001
Thanks David for the patch that Alvaro committed yesterday. Agree that it's a good idea. On Fri, Feb 1, 2019 at 3:11 PM David Rowley <david.rowley@2ndquadrant.com> wrote: > On Fri, 1 Feb 2019 at 23:01, Alvaro Herrera <alvherre@2ndquadrant.com> wrote: > > Please rebase. > > I had a short list of other things I noticed when making a partial > pass over the patch again. > > I may as well send these now if there's a new version on the way: Thanks. > 1. I think it's okay to convert the following: > > /* > * Adjust all_baserels to replace the original target relation with the > * child target relation. Copy it before modifying though. > */ > subroot->all_baserels = bms_copy(root->all_baserels); > subroot->all_baserels = bms_del_member(subroot->all_baserels, > root->parse->resultRelation); > subroot->all_baserels = bms_add_member(subroot->all_baserels, > subroot->parse->resultRelation); > > into: > /* Adjust all_baserels */ > subroot->all_baserels = adjust_child_relids(root->all_baserels, 1, &appinfo); Makes sense, done. > 2. Any reason to do: > > /* > * Generate access paths for the entire join tree. > * > * For UPDATE/DELETE on an inheritance parent, join paths should be > * generated for each child result rel separately. > */ > if (root->parse->resultRelation && > root->simple_rte_array[root->parse->resultRelation]->inh) > > instead of just checking: if (root->inherited_update) Good reminder, done. > 3. This seems like useless code in set_inherit_target_rel_sizes(). > > /* > * If parallelism is allowable for this query in general, see whether > * it's allowable for this childrel in particular. For consistency, > * do this before calling set_rel_size() for the child. > */ > if (root->glob->parallelModeOK) > set_rel_consider_parallel(subroot, childrel, childRTE); > > > parallelModeOK is only ever set for SELECT. Likely it's fine just to > replace these with: > > + /* We don't consider parallel paths for UPDATE/DELETE > statements */ > + childrel->consider_parallel = false; > > or perhaps it's fine to leave it out since build_simple_rel() sets it to false. OK, removed that code. Attached updated patches. It took me a bit longer than expected to rebase the patches as I hit a mysterious bug that I couldn't pinpoint until this afternoon. One big change is related to how ECs are transferred to child PlannerInfos. As David suggested upthread, I created a block in adjust_appendrel_attrs_mutator that creates a translated copy of a given EC containing wherein the parent expression in the original ec_members list is replaced by the corresponding child expression. With that in place, we no longer need the changes to add_child_rel_equivalences(). Instead there's just: subroot->eq_classes = adjust_appendrel_attrs(root, root->eq_classes, ...), just as David described upthread. Thanks, Amit
Commits
-
Clean up handling of constraint_exclusion and enable_partition_pruning.
- e03ff739695c 12.0 landed
- 11ea45ffec9a 11.3 landed
-
Add test case exercising formerly-unreached code in inheritance_planner.
- 8fba397f0ca7 12.0 landed
-
Speed up planning when partitions can be pruned at plan time.
- 428b260f87e8 12.0 landed
-
Avoid crash in partitionwise join planning under GEQO.
- 7ad6498fd5a6 12.0 landed
- d70c147fa217 11.3 landed
-
Avoid passing query tlist around separately from root->processed_tlist.
- 333ed246c6f3 12.0 landed
-
Build "other rels" of appendrel baserels in a separate step.
- 53bcf5e3dbea 12.0 landed
-
Get rid of duplicate child RTE for a partitioned table.
- e8d5dd6be79e 12.0 landed
-
Rearrange make_partitionedrel_pruneinfo to avoid work when we can't prune.
- 734308a22072 12.0 landed
-
Don't copy PartitionBoundInfo in set_relation_partition_info.
- c8151e642368 12.0 landed
-
Move building of child base quals out into a new function
- 80579f9bb171 12.0 landed
-
Reorganize planner code moved in b60c39759908
- d723f56872a9 12.0 landed
-
Move inheritance expansion code into its own file
- b60c39759908 12.0 landed
-
Fix inherited UPDATE/DELETE with UNION ALL subqueries.
- c03ad5602f52 9.4.0 cited
-
Rearrange planner to save the whole PlannerInfo (subroot) for a subquery.
- b3aaf9081a1a 9.2.0 cited