Re: [HACKERS] Partition-wise aggregation/grouping
Jeevan Chalke <jeevan.chalke@enterprisedb.com>
Attachments
- 0001-Remove-target-from-GroupPathExtraData-instead-fetch-.patch (text/x-patch) patch 0001
- 0002-Teach-postgres_fdw-to-push-aggregates-for-child-rela.patch (text/x-patch) patch 0002
- 0003-Add-agg_costs-in-GroupPathExtraData-so-that-FDW-can-.patch (text/x-patch) patch 0003
On Wed, Mar 28, 2018 at 7:21 PM, Ashutosh Bapat < ashutosh.bapat@enterprisedb.com> wrote: > On Tue, Mar 27, 2018 at 2:43 PM, Jeevan Chalke > <jeevan.chalke@enterprisedb.com> wrote: > > > I am not sure on what we should Assetrt here. Note that we end-up here > only > > when doing grouping, and thus I don't think we need any Assert here. > > Let me know if I missed anything. > > Since we are just checking whether it's an upper relation and directly > using root->upper_targets[UPPERREL_GROUP_AGG], I thought we could add > an assert to verify that it's really the grouping rel we are dealing > with. But I guess, we can't really check that from given relation. But > then for a grouped rel we can get its target from RelOptInfo. So, we > shouldn't need to root->upper_targets[UPPERREL_GROUP_AGG]. Am I > missing something? For other upper relations we do not set the target > yet but then we could assert that there exists one in the grouped > relation. > Yes. We fetch target from the grouped_rel itself. Added Assert() per out off-list discussion. > > > > >> > >> > >> - get_agg_clause_costs(root, (Node *) > >> root->parse->havingQual, > >> + get_agg_clause_costs(root, fpinfo->havingQual, > >> AGGSPLIT_SIMPLE, &aggcosts); > >> } > >> Should we pass agg costs as well through GroupPathExtraData to avoid > >> calculating it again in this function? > > > > > > Adding an extra member in GroupPathExtraData just for FDW does not look > good > > to me. > > But yes, if we do that, then we can save this calculation. > > Let me know if its OK to have an extra member for just FDW use, will > prepare > > a separate patch for that. > > I think that should be fine. A separate patch would be good, so that a > committer can decide whether or not to include it. > Attached patch 0003 for this. > > > >> > >> + Node *havingQual; > >> I am wondering whether we could use remote_conds member for storing > this. > > > > > > This havingQual is later checked for shippability and classified into > > pushable and non-pushable quals and stored in remote_conds and > local_conds > > respectively. > > Storing it directly in remote_conds and then splitting it does not look > good > > to me. > > Also, remote_conds is list of RestrictInfo nodes whereas havingQual is > not. > > So using that for storing havingQual does not make sense. So better to > have > > a separate member in PgFdwRelationInfo. > > Ah sorry, I was wrong about remote_conds. remote_conds and local_conds > are basically the conditions on the relation being pushed down. > havingQuals are conditions on a grouped relation so treating them like > baserestrictinfo or join conditions looks more straight forward, > rather than having a separate member in PgFdwRelationInfo. So, remote > havingQuals go into remote_conds and local havingQuals go to > local_conds. > OK. Agree. In this version, I have not added anything in PgFdwRelationInfo. Having qual is needed at two places; (1) in foreign_grouping_ok() to check shippability, so passed this translated HAVING qual as a parameter to it, and (2) estimating aggregates costs in estimate_path_cost_size(); there we can use havingQual from root itself as costs won't change for parent and child. Thus no need of storing a havingQual in PgFdwRelationInfo. Thanks -- > Best Wishes, > Ashutosh Bapat > EnterpriseDB Corporation > The Postgres Database 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