mirror of https://github.com/citusdata/citus.git
Respect enable_hashagg in the master planner for group by
parent
6001f753ed
commit
6ed64d06ea
|
@ -21,6 +21,7 @@
|
||||||
#include "nodes/makefuncs.h"
|
#include "nodes/makefuncs.h"
|
||||||
#include "nodes/nodeFuncs.h"
|
#include "nodes/nodeFuncs.h"
|
||||||
#include "optimizer/clauses.h"
|
#include "optimizer/clauses.h"
|
||||||
|
#include "optimizer/cost.h"
|
||||||
#include "optimizer/planmain.h"
|
#include "optimizer/planmain.h"
|
||||||
#include "optimizer/tlist.h"
|
#include "optimizer/tlist.h"
|
||||||
#include "optimizer/var.h"
|
#include "optimizer/var.h"
|
||||||
|
@ -128,13 +129,47 @@ BuildAggregatePlan(Query *masterQuery, Plan *subPlan)
|
||||||
/* if we have grouping, then initialize appropriate information */
|
/* if we have grouping, then initialize appropriate information */
|
||||||
if (groupColumnCount > 0)
|
if (groupColumnCount > 0)
|
||||||
{
|
{
|
||||||
if (!grouping_is_hashable(groupColumnList))
|
bool groupingIsHashable = grouping_is_hashable(groupColumnList);
|
||||||
|
bool groupingIsSortable = grouping_is_sortable(groupColumnList);
|
||||||
|
|
||||||
|
if (!groupingIsHashable && !groupingIsSortable)
|
||||||
{
|
{
|
||||||
ereport(ERROR, (errmsg("grouped column list cannot be hashed")));
|
ereport(ERROR, (errmsg("grouped column list cannot be hashed or sorted")));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* switch to hashed aggregate strategy to allow grouping */
|
/*
|
||||||
|
* Postgres hash aggregate strategy does not support distinct aggregates
|
||||||
|
* in group and order by with aggregate operations.
|
||||||
|
* see nodeAgg.c:build_pertrans_for_aggref(). In that case we use
|
||||||
|
* sorted agg strategy, otherwise we use hash strategy.
|
||||||
|
*/
|
||||||
|
if (!enable_hashagg || !groupingIsHashable)
|
||||||
|
{
|
||||||
|
char *messageHint = NULL;
|
||||||
|
if (!enable_hashagg && groupingIsHashable)
|
||||||
|
{
|
||||||
|
messageHint = "Consider setting enable_hashagg to on.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!groupingIsSortable)
|
||||||
|
{
|
||||||
|
ereport(ERROR, (errmsg("grouped column list must cannot be sorted"),
|
||||||
|
errdetail("Having a distinct aggregate requires "
|
||||||
|
"grouped column list to be sortable."),
|
||||||
|
messageHint ? errhint("%s", messageHint) : 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
aggregateStrategy = AGG_SORTED;
|
||||||
|
#if (PG_VERSION_NUM >= 90600)
|
||||||
|
subPlan = (Plan *) make_sort_from_sortclauses(groupColumnList, subPlan);
|
||||||
|
#else
|
||||||
|
subPlan = (Plan *) make_sort_from_sortclauses(NULL, groupColumnList, subPlan);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
aggregateStrategy = AGG_HASHED;
|
aggregateStrategy = AGG_HASHED;
|
||||||
|
}
|
||||||
|
|
||||||
/* get column indexes that are being grouped */
|
/* get column indexes that are being grouped */
|
||||||
groupColumnIdArray = extract_grouping_cols(groupColumnList, subPlan->targetlist);
|
groupColumnIdArray = extract_grouping_cols(groupColumnList, subPlan->targetlist);
|
||||||
|
|
|
@ -686,3 +686,23 @@ Custom Scan (Citus Router)
|
||||||
-> Seq Scan on explain_table_570001 explain_table
|
-> Seq Scan on explain_table_570001 explain_table
|
||||||
Filter: (id = 1)
|
Filter: (id = 1)
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
|
-- Test disable hash aggregate
|
||||||
|
SET enable_hashagg TO off;
|
||||||
|
EXPLAIN (COSTS FALSE, FORMAT TEXT)
|
||||||
|
SELECT l_quantity, count(*) count_quantity FROM lineitem
|
||||||
|
GROUP BY l_quantity ORDER BY count_quantity, l_quantity;
|
||||||
|
Sort
|
||||||
|
Sort Key: COALESCE((pg_catalog.sum((COALESCE((pg_catalog.sum(remote_scan.count_quantity))::bigint, '0'::bigint))))::bigint, '0'::bigint), remote_scan.l_quantity
|
||||||
|
-> GroupAggregate
|
||||||
|
Group Key: remote_scan.l_quantity
|
||||||
|
-> Sort
|
||||||
|
Sort Key: remote_scan.l_quantity
|
||||||
|
-> Custom Scan (Citus Real-Time)
|
||||||
|
Task Count: 8
|
||||||
|
Tasks Shown: One of 8
|
||||||
|
-> Task
|
||||||
|
Node: host=localhost port=57637 dbname=regression
|
||||||
|
-> HashAggregate
|
||||||
|
Group Key: l_quantity
|
||||||
|
-> Seq Scan on lineitem_290001 lineitem
|
||||||
|
SET enable_hashagg TO on;
|
||||||
|
|
|
@ -657,3 +657,23 @@ Custom Scan (Citus Router)
|
||||||
-> Seq Scan on explain_table_570001 explain_table
|
-> Seq Scan on explain_table_570001 explain_table
|
||||||
Filter: (id = 1)
|
Filter: (id = 1)
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
|
-- Test disable hash aggregate
|
||||||
|
SET enable_hashagg TO off;
|
||||||
|
EXPLAIN (COSTS FALSE, FORMAT TEXT)
|
||||||
|
SELECT l_quantity, count(*) count_quantity FROM lineitem
|
||||||
|
GROUP BY l_quantity ORDER BY count_quantity, l_quantity;
|
||||||
|
Sort
|
||||||
|
Sort Key: COALESCE((pg_catalog.sum((COALESCE((pg_catalog.sum(remote_scan.count_quantity))::bigint, '0'::bigint))))::bigint, '0'::bigint), remote_scan.l_quantity
|
||||||
|
-> GroupAggregate
|
||||||
|
Group Key: remote_scan.l_quantity
|
||||||
|
-> Sort
|
||||||
|
Sort Key: remote_scan.l_quantity
|
||||||
|
-> Custom Scan (Citus Real-Time)
|
||||||
|
Task Count: 8
|
||||||
|
Tasks Shown: One of 8
|
||||||
|
-> Task
|
||||||
|
Node: host=localhost port=57637 dbname=regression
|
||||||
|
-> HashAggregate
|
||||||
|
Group Key: l_quantity
|
||||||
|
-> Seq Scan on lineitem_290001 lineitem
|
||||||
|
SET enable_hashagg TO on;
|
||||||
|
|
|
@ -247,3 +247,11 @@ ALTER TABLE explain_table ADD COLUMN value int;
|
||||||
EXPLAIN (COSTS FALSE) SELECT value FROM explain_table WHERE id = 1;
|
EXPLAIN (COSTS FALSE) SELECT value FROM explain_table WHERE id = 1;
|
||||||
|
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
|
|
||||||
|
-- Test disable hash aggregate
|
||||||
|
SET enable_hashagg TO off;
|
||||||
|
EXPLAIN (COSTS FALSE, FORMAT TEXT)
|
||||||
|
SELECT l_quantity, count(*) count_quantity FROM lineitem
|
||||||
|
GROUP BY l_quantity ORDER BY count_quantity, l_quantity;
|
||||||
|
|
||||||
|
SET enable_hashagg TO on;
|
||||||
|
|
Loading…
Reference in New Issue