Re: [HACKERS] Partition-wise aggregation/grouping
Jeevan Chalke <jeevan.chalke@enterprisedb.com>
Attachments
- partition-wise-agg-v23.tar.gz (application/gzip)
On Thu, Mar 22, 2018 at 3:26 AM, Robert Haas <robertmhaas@gmail.com> wrote: > On Wed, Mar 21, 2018 at 11:33 AM, Jeevan Chalke > <jeevan.chalke@enterprisedb.com> wrote: > > Let me try to explain this: > > 1. GROUPING_CAN_PARTITIONWISE_AGG > > 2. extra->is_partial_aggregation > > 3. extra->perform_partial_partitionwise_aggregation > > Please find attached an incremental patch that attempts to refactor > this logic into a simpler form. What I've done is merged all three of > the above Booleans into a single state variable called 'patype', which > can be one of PARTITIONWISE_AGGREGATE_NONE, > PARTITIONWISE_AGGREGATE_FULL, and PARTITIONWISE_AGGREGATE_PARTIAL. > When create_ordinary_grouping_paths() is called, extra.patype is the > value for the parent relation; that function computes a new value and > passes it down to create_partitionwise_grouping_paths(), which inserts > into the new 'extra' structure for the child. > > Essentially, in your system, extra->is_partial_aggregation and > extra->perform_partial_partitionwise_aggregation both corresponded to > whether or not patype == PARTITIONWISE_AGGREGATE_PARTIAL, but the > former indicated whether the *parent* was doing partition-wise > aggregation (and thus we needed to generate only partial paths) while > the latter indicated whether the *current* relation was doing > partition-wise aggregation (and thus we needed to force creation of > partially_grouped_rel). This took me a long time to understand > because of the way the fields were named; they didn't indicate that > one was for the parent and one for the current relation. Meanwhile, > GROUPING_CAN_PARTITIONWISE_AGG indicated whether partition-wise > aggregate should be tried at all for the current relation; there was > no analogous indicator for the parent relation because we can't be > processing a child at all if the parent didn't decide to do > partition-wise aggregation. So to know what was happening for the > current relation you had to look at GROUPING_CAN_PARTITIONWISE_AGG + > extra->perform_partial_partitionwise_aggregation, and to know what was > happening for the parent relation you just looked at > extra->is_partial_aggregation. With this proposed refactoring patch, > there's just one patype value at each level, which at least to me > seems simpler. I tried to improve the comments somewhat, too. > Leeks cleaner now. Thanks for refactoring it. I have merged these changes and flatten all previuos changes into the main patch. > > You have some long lines that it would be good to break, like this: > > child_extra.targetList = (List *) adjust_appendrel_attrs(root, > > (Node *) extra->targetList, > > nappinfos, > > appinfos); > > If you put a newline after (List *), the formatting will come out > nicer -- it will fit within 80 columns. Please go through the patches > and make these kinds of changes for lines over 80 columns where > possible. > OK. Done. I was under impression that it is not good to split the first line. What if in split version, while applying any new patch or in Merge process something gets inserted between them? That will result into something unexpected. But I am not sure if that's ever a possibility. > I guess we'd better move the GROUPING_CAN_* constants to a header > file, if they're going to be exposed through GroupPathExtraData. That > can go in some refactoring patch. > Yep. Moved that into 0003 where we create GroupPathExtraData. > Is there a good reason not to use input_rel->relids as the input to > fetch_upper_rel() in all cases, rather than just at subordinate > levels? > > -- > Robert Haas > EnterpriseDB: http://www.enterprisedb.com > The Enterprise PostgreSQL Company > -- Jeevan Chalke Technical Architect, Product Development EnterpriseDB Corporation The Enterprise PostgreSQL Company
Commits
-
postgres_fdw: Push down partition-wise aggregation.
- 7e0d64c7a57e 11.0 landed
-
Remove 'target' from GroupPathExtraData.
- c1de1a3a8b93 11.0 landed
-
Implement partition-wise grouping/aggregation.
- e2f1eb0ee30d 11.0 landed
-
Don't pass the grouping target around unnecessarily.
- 94150513ec12 11.0 landed
-
Determine grouping strategies in create_grouping_paths.
- b5996c2791f3 11.0 landed
-
Defer creation of partially-grouped relation until it's needed.
- 4f15e5d09de2 11.0 landed
-
Split create_grouping_paths into degenerate and non-degenerate cases.
- 1466bcfa4a83 11.0 landed
-
Pass additional arguments to a couple of grouping-related functions.
- 648a6c7bd815 11.0 landed
-
Fix logic error in add_paths_to_partial_grouping_rel.
- 3bfe957761ac 11.0 landed
-
Minor cleanup of code related to partially_grouped_rel.
- 5e6a63c0d102 11.0 landed
-
Add a new upper planner relation for partially-aggregated results.
- 3bf05e096b9f 11.0 landed
-
Charge cpu_tuple_cost * 0.5 for Append and MergeAppend nodes.
- 7d8ac9814bc9 11.0 landed
-
Rename enable_partition_wise_join to enable_partitionwise_join
- 2fb1abaeb016 11.0 cited
-
Factor some code out of create_grouping_paths.
- 9fd8b7d63257 11.0 landed
-
Pad XLogReaderState's main_data buffer more aggressively.
- 8735978e7aeb 11.0 cited
-
Prevent int128 from requiring more than MAXALIGN alignment.
- 7518049980be 11.0 cited
-
Fix DROP SUBSCRIPTION hang
- 8edacab20995 11.0 cited
-
Inject $(ICU_LIBS) regardless of platform.
- 66ed3829df95 11.0 cited
-
Some preliminary refactoring towards partitionwise join.
- c44c47a773bd 10.0 cited