Re: Eager aggregation, take 3
Richard Guo <guofenglinux@gmail.com>
Attachments
- v8-0001-Introduce-RelInfoList-structure.patch (application/octet-stream) patch v8-0001
- v8-0002-Introduce-RelAggInfo-structure-to-store-info-for-grouped-paths.patch (application/octet-stream) patch v8-0002
- v8-0003-Set-up-for-eager-aggregation-by-collecting-needed-infos.patch (application/octet-stream) patch v8-0003
- v8-0004-Implement-functions-that-create-RelAggInfos-if-applicable.patch (application/octet-stream) patch v8-0004
- v8-0005-Implement-functions-that-generate-paths-for-grouped-relations.patch (application/octet-stream) patch v8-0005
- v8-0006-Build-grouped-relations-out-of-base-relations.patch (application/octet-stream) patch v8-0006
- v8-0007-Build-grouped-relations-out-of-join-relations.patch (application/octet-stream) patch v8-0007
- v8-0008-Add-test-cases.patch (application/octet-stream) patch v8-0008
- v8-0009-Add-README.patch (application/octet-stream) patch v8-0009
On Mon, May 20, 2024 at 4:12 PM Richard Guo <guofenglinux@gmail.com> wrote: > Another rebase is needed after d1d286d83c. Also I realized that the > partially_grouped_rel generated by eager aggregation might be dummy, > such as in query: > > select count(t2.c) from t t1 join t t2 on t1.b = t2.b where false group by t1.a; > > If somehow we choose this dummy path with a Finalize Agg Path on top of > it as the final cheapest path (a very rare case), we would encounter the > "Aggref found in non-Agg plan node" error. The v7 patch fixes this > issue. I spent some time testing this patchset and found a few more issues. One issue is that partially-grouped partial paths may have already been generated in the process of building up the grouped join relations by eager aggregation, in which case the partially_grouped_rel would contain valid partial paths by the time we reach create_partial_grouping_paths. If we subsequently find that parallelism is not possible for partially_grouped_rel, we need to drop these partial paths; otherwise we risk encountering Assert(subpath->parallel_safe) when creating gather / gather merge path. This issue can be reproduced with the query below on v7 patch. create function parallel_restricted_func(a int) returns int as $$ begin return a; end; $$ parallel restricted language plpgsql; create table t (a int, b int, c int) with (parallel_workers = 2); set enable_eager_aggregate to on; explain (costs off) select parallel_restricted_func(1) * count(t2.c) from t t1, t t2 where t1.b = t2.b group by t2.c; Another issue I found is that when we check to see whether a given Var appears only within Aggrefs, we need to account for havingQual in addition to targetlist; otherwise there's a risk of omitting this Var from the targetlist of the partial Agg node, leading to 'ERROR: variable not found in subplan target list'. This error can be reproduced with the query below on v7. create table t (a int primary key, b int, c int); set enable_eager_aggregate to on; explain (costs off) select count(*) from t t1, t t2 group by t1.a having min(t1.b) < t1.b; ERROR: variable not found in subplan target list A third issue I found is that with v7 we might push the Partial Agg to the nullable side of an outer join, which is not correct. This happens because when determining whether a Partial Agg can be pushed down to a relation, the v7 patchset indeed checks if the aggregate expressions can be evaluated at this relation level. However, it overlooks checking the grouping expressions. The grouping expressions can originate from two sources: the original GROUP BY clauses, or constructed from join conditions. In either case, we must verify that the grouping expressions cannot be nulled by outer joins that are above the current relation, otherwise the Partial Agg cannot be pushed down to this rel. Hence here is the v8 patchset, with fixes for all the above issues. Thanks Richard
Commits
-
Fix eager aggregation for semi/antijoin inner rels
- ffeda04259bb 19 (unreleased) landed
-
Cover additional errors and corner conditions in repack.c
- 2670cc298f42 19 (unreleased) cited
-
Fix volatile function evaluation in eager aggregation
- 3a08a2a8b4fd 19 (unreleased) landed
-
Fix collation handling for grouping keys in eager aggregation
- bd94845e8c90 19 (unreleased) landed
-
Rename apply_at to apply_agg_at for clarity
- 1206df04c200 19 (unreleased) landed
-
Fix comment in eager_aggregate.sql
- 36fd8bde1b77 19 (unreleased) landed
-
Remove unnecessary include of "utils/fmgroids.h"
- f997d777adf7 19 (unreleased) landed
-
Implement Eager Aggregation
- 8e11859102f9 19 (unreleased) landed
-
Allow negative aggtransspace to indicate unbounded state size
- 185e30426334 19 (unreleased) landed
-
Add macros for looping through a List without a ListCell.
- 14dd0f27d7cd 17.0 cited
-
Account for the effect of lossy pages when costing bitmap scans.
- 5edc63bda68a 11.0 cited
-
Fix a thinko in join_is_legal: when we decide we can implement a semijoin
- a43b190e3c71 9.0.0 cited