Re: [HACKERS] Partition-wise aggregation/grouping
Jeevan Chalke <jeevan.chalke@enterprisedb.com>
On Wed, Mar 21, 2018 at 7:46 PM, Robert Haas <robertmhaas@gmail.com> wrote: > On Wed, Mar 21, 2018 at 8:01 AM, Jeevan Chalke > <jeevan.chalke@enterprisedb.com> wrote: > >> In the patch as proposed, create_partial_grouping_paths() can get > >> called even if GROUPING_CAN_PARTIAL_AGG is not set. I think that's > >> wrong. > > > > I don't think so. For parallel case, we do check that. And for > partitionwise > > aggregation check, it was checked inside can_partitionwise_grouping() > > function and flags were set accordingly. Am I missing something? > > Well, one of us is missing something somewhere. If > GROUPING_CAN_PARTIAL_AGG means that we're allowed to do partial > grouping, and if create_partial_grouping_paths() is where partial > grouping happens, then we should only be calling the latter if the > former is set. I mean, how can it make sense to create > partially-grouped paths if we're not allowed to do partial grouping? > Yes, that's true. If we are not allowed to do partial grouping, partially_grouped paths should not be created. However, what I mean is that the partitionwise related checks added, if evaluates to true it implies that GROUPING_CAN_PARTIAL_AGG is also set as it was checked earlier. And thus does not need explicit check again. Anyway, after your refactoring, it becomes more readable now. > > > I have tweaked these conditions and posted in a separate patch (0006). > > However, I have merged all your three patches in one (0005). > > OK, thanks. I wasn't sure I had understood what was going on, so > thanks for checking it. > > Thanks also for keeping 0004-0006 separate here, but I think you can > flatten them into one patch in the next version. > OK. Sure. > > >> I think that if the last test in can_partitionwise_grouping were moved > >> before the previous test, it could be simplified to test only > >> (extra->flags & GROUPING_CAN_PARTIAL_AGG) == 0 and not > >> *perform_partial_partitionwise_aggregation. > > > > I think we can't do this way. If *perform_partial_ > partitionwise_aggregation > > found to be true then only we need to check whether partial aggregation > > itself is possible or not. If we are going to perform a full > partitionwise > > aggregation then test for can_partial_agg is not needed. Have I misread > your > > comments? > > It seems you're correct, because when I change it the tests fail. I > don't yet understand why. > > Basically, the main patch seems to use three Boolean signaling mechanisms: > > 1. GROUPING_CAN_PARTITIONWISE_AGG > 2. is_partial_aggregation > 3. perform_partial_partitionwise_aggregation > > Stuff I don't understand: > > - Why is one of them a Boolean shoved into "flags", even though it's > not static across the whole hierarchy like the other flags, and the > other two are separate Booleans? > - What do they all do, anyway? > Let me try to explain this: 1. GROUPING_CAN_PARTITIONWISE_AGG Tells us whether or not partitionwise grouping and/or aggregation is ever possible. If it is FALSE, other two have no meaning and they will be useless. However, if it is TRUE, then only we attempt to create paths partitionwise. I have kept it in "flags" as it looks similar in behavior with other flag members like can_sort, can_hash etc. And, for given grouped relation whether parent or child, they all work similarly. But yes, for child relation, we inherit can_sort/can_hash from the parent as they won't change. But need to evaluate this for every child. If required, I can move that to a GroupPathExtraData struct. 2. extra->is_partial_aggregation This boolean var is used to identify at any given time whether we are computing a full aggregation or a partial aggregation. This boolean is necessary when doing partial aggregation to skip finalization. And also tells us to use partially_grouped_rel when true. 3. extra->perform_partial_partitionwise_aggregation This boolean var is used to instruct child that it has to create a partially aggregated paths when TRUE. And then it transferred to child_extra->is_partial_aggregation in create_partitionwise_grouping_paths(). Basically (3) is required as we wanted to create a partially_grouped_rel upfront. So that if the child is going to create a partially aggregated paths, they can append those into the parent's partially grouped rel and thus we need to create that before even we enter into the child paths creation. Since (3) is only valid if (1) is true, we need to compute (1) upfront too. > > -- > 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