mirror of
https://github.com/postgres/postgres.git
synced 2025-11-03 09:13:20 +03:00
Support hashed aggregation with grouping sets.
This extends the Aggregate node with two new features: HashAggregate can now run multiple hashtables concurrently, and a new strategy MixedAggregate populates hashtables while doing sorted grouping. The planner will now attempt to save as many sorts as possible when planning grouping sets queries, while not exceeding work_mem for the estimated combined sizes of all hashtables used. No SQL-level changes are required. There should be no user-visible impact other than the new EXPLAIN output and possible changes to result ordering when ORDER BY was not used (which affected a few regression tests). The enable_hashagg option is respected. Author: Andrew Gierth Reviewers: Mark Dilger, Andres Freund Discussion: https://postgr.es/m/87vatszyhj.fsf@news-spur.riddles.org.uk
This commit is contained in:
@@ -1418,17 +1418,37 @@ typedef struct AggPath
|
||||
} AggPath;
|
||||
|
||||
/*
|
||||
* GroupingSetsPath represents a GROUPING SETS aggregation
|
||||
*
|
||||
* Currently we only support this in sorted not hashed form, so the input
|
||||
* must always be appropriately presorted.
|
||||
* Various annotations used for grouping sets in the planner.
|
||||
*/
|
||||
|
||||
typedef struct GroupingSetData
|
||||
{
|
||||
NodeTag type;
|
||||
List *set; /* grouping set as list of sortgrouprefs */
|
||||
double numGroups; /* est. number of result groups */
|
||||
} GroupingSetData;
|
||||
|
||||
typedef struct RollupData
|
||||
{
|
||||
NodeTag type;
|
||||
List *groupClause; /* applicable subset of parse->groupClause */
|
||||
List *gsets; /* lists of integer indexes into groupClause */
|
||||
List *gsets_data; /* list of GroupingSetData */
|
||||
double numGroups; /* est. number of result groups */
|
||||
bool hashable; /* can be hashed */
|
||||
bool is_hashed; /* to be implemented as a hashagg */
|
||||
} RollupData;
|
||||
|
||||
/*
|
||||
* GroupingSetsPath represents a GROUPING SETS aggregation
|
||||
*/
|
||||
|
||||
typedef struct GroupingSetsPath
|
||||
{
|
||||
Path path;
|
||||
Path *subpath; /* path representing input source */
|
||||
List *rollup_groupclauses; /* list of lists of SortGroupClause's */
|
||||
List *rollup_lists; /* parallel list of lists of grouping sets */
|
||||
AggStrategy aggstrategy; /* basic strategy */
|
||||
List *rollups; /* list of RollupData */
|
||||
List *qual; /* quals (HAVING quals), if any */
|
||||
} GroupingSetsPath;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user