Re: speeding up planning with partitions
Tom Lane <tgl@sss.pgh.pa.us>
Amit Langote <Langote_Amit_f8@lab.ntt.co.jp> writes: > [ v34 patch set ] I had a bit of a look through this. I went ahead and pushed 0008 and 0009, as they seem straightforward and independent of the rest. (BTW, 0009 makes 0003's dubious optimization in set_relation_partition_info quite unnecessary.) As for the rest: 0001: OK in principle, but I wonder why you implemented it by adding another recursive scan of the jointree rather than just iterating over the baserel array, as in make_one_rel() for instance. Seems like this way is more work, and more code that we'll have to touch if we ever change the jointree representation. I also feel like you used a dartboard while deciding where to insert the call in query_planner(); dropping it into the middle of a sequence of equivalence-class-related operations seems quite random. Maybe we could delay that step all the way to just before make_one_rel, since the other stuff in between seems to only care about baserels? For example, it'd certainly be better if we could run remove_useless_joins before otherrel expansion, so that we needn't do otherrel expansion at all on a table that gets thrown away as being a useless join. BTW, it strikes me that we could take advantage of the fact that baserels must all appear before otherrels in the rel array, by having loops over that array stop early if they're only interested in baserels. We could either save the index of the last baserel, or just extend the loop logic to fall out upon hitting an otherrel. Seems like this'd save some cycles when there are lots of partitions, although perhaps loops like that would be fast enough to not matter. 0002: I seriously dislike this from a system-structure viewpoint. For one thing it makes root->processed_tlist rather moot, since it doesn't get set till after most of the work is done. (I don't know if there are any FDWs out there that look at processed_tlist, but they'd be broken by this if so. It'd be better to get rid of the field if we can, so that at least such breakage is obvious. Or, maybe, use root->processed_tlist as the communication field rather than having the tlist be a param to query_planner?) I also don't like the undocumented way that you've got build_base_rel_tlists working on something that's not the final tlist, and then going back and doing more work of the same sort later. I wonder whether we can postpone build_base_rel_tlists until after the other stuff happens, so that it can continue to do all of the tlist-distribution work. 0003: I haven't studied this in great detail, but it seems like there's some pretty random things in it, like this addition in inheritance_planner: + /* grouping_planner doesn't need to see the target children. */ + subroot->append_rel_list = list_copy(orig_append_rel_list); That sure seems like a hack unrelated to the purpose of the patch ... and since list_copy is a shallow copy, I'm not even sure it's safe. Won't we be mutating the contained (and shared) AppendRelInfos as we go along? 0004 and 0005: I'm not exactly thrilled about loading more layers of overcomplication into inheritance_planner, especially not when the complication then extends out into new global planner flags with questionable semantics. We should be striving to get rid of that function, as previously discussed, and I fear this is just throwing more roadblocks in the way of doing so. Can we skip these and come back to the question after we replace inheritance_planner with expand-at-the-bottom? 0006: Seems mostly OK, but I'm not very happy about the additional table_open calls it's throwing into random places in the planner. Those can be rather expensive. Why aren't we collecting the appropriate info during the initial plancat.c consultation of the relcache? 0007: Not really sold on this; it seems like it's going to be a net negative for cases where there aren't a lot of partitions. regards, tom lane
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