You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudberry.apache.org by ma...@apache.org on 2024/12/18 03:42:54 UTC

(cloudberry) branch main updated: ORCA: allow not enforce distribution key in 3-stage aggregate (#776)

This is an automated email from the ASF dual-hosted git repository.

maxyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git


The following commit(s) were added to refs/heads/main by this push:
     new 0deffcbac4 ORCA: allow not enforce distribution key in 3-stage aggregate (#776)
0deffcbac4 is described below

commit 0deffcbac4c369e88b2878e4d9ffba96963e37f0
Author: jiaqizho <zh...@hashdata.cn>
AuthorDate: Wed Dec 18 11:42:50 2024 +0800

    ORCA: allow not enforce distribution key in 3-stage aggregate (#776)
    
    In the case where the group-by key is a distribution key, ORCA disables 3-stage aggregate by default.
    
    Add a new GUC(optimizer_enable_use_distribution_in_dqa) to allow not enforce distribution key in 3-stage
    aggregate in ORCA. which enables local deduplication before the 2-stage agg.
---
 src/backend/gpopt/config/CConfigParamMapping.cpp   |  6 +++++-
 .../gporca/libgpopt/src/operators/CPhysicalAgg.cpp | 17 +++++++++++------
 .../include/naucrates/traceflags/traceflags.h      |  5 ++++-
 src/backend/utils/misc/guc_gp.c                    | 12 ++++++++++++
 src/include/utils/guc.h                            |  1 +
 src/include/utils/unsync_guc_name.h                |  1 +
 src/test/regress/expected/gp_dqa.out               |  7 +++++++
 src/test/regress/expected/gp_dqa_optimizer.out     | 22 ++++++++++++++++------
 src/test/regress/sql/gp_dqa.sql                    |  7 +++++++
 9 files changed, 64 insertions(+), 14 deletions(-)

diff --git a/src/backend/gpopt/config/CConfigParamMapping.cpp b/src/backend/gpopt/config/CConfigParamMapping.cpp
index 54bcc0698a..8d490444e8 100644
--- a/src/backend/gpopt/config/CConfigParamMapping.cpp
+++ b/src/backend/gpopt/config/CConfigParamMapping.cpp
@@ -290,7 +290,11 @@ CConfigParamMapping::SConfigMappingElem CConfigParamMapping::m_elements[] = {
 	 false,	 // m_negate_param
 	 GPOS_WSZ_LIT(
 		 "Explore a nested loop join even if a hash join is possible")},
-
+	{EopttraceEnableUseDistributionInDQA,
+	 &optimizer_enable_use_distribution_in_dqa,
+	 false,	 // m_negate_param
+	 GPOS_WSZ_LIT(
+		 "Enable use the distribution key in DQA")},
 };
 
 //---------------------------------------------------------------------------
diff --git a/src/backend/gporca/libgpopt/src/operators/CPhysicalAgg.cpp b/src/backend/gporca/libgpopt/src/operators/CPhysicalAgg.cpp
index 1100b56e52..c20d68cc42 100644
--- a/src/backend/gporca/libgpopt/src/operators/CPhysicalAgg.cpp
+++ b/src/backend/gporca/libgpopt/src/operators/CPhysicalAgg.cpp
@@ -115,12 +115,17 @@ CPhysicalAgg::CPhysicalAgg(
 		ulDistrReqs = 2;
 	}
 
-	// Split DQA generates a 2-stage aggregate to handle the case where
-	// hash aggregate has a distinct agg func. Here we need to be careful
-	// not to prohibit distribution property enforcement.
-	m_should_enforce_distribution &= !(
-		isAggFromSplitDQA && aggStage == CLogicalGbAgg::EasTwoStageScalarDQA &&
-		colref_array->Size() > 0);
+	// Force enable distribution property in DQA
+	if (GPOS_FTRACE(EopttraceEnableUseDistributionInDQA)) {
+		m_should_enforce_distribution = false;
+	} else {
+		// Split DQA generates a 2-stage aggregate to handle the case where
+		// hash aggregate has a distinct agg func. Here we need to be careful
+		// not to prohibit distribution property enforcement.
+		m_should_enforce_distribution &= !(
+			isAggFromSplitDQA && aggStage == CLogicalGbAgg::EasTwoStageScalarDQA &&
+			colref_array->Size() > 0);
+	}
 
 	SetDistrRequests(ulDistrReqs);
 }
diff --git a/src/backend/gporca/libnaucrates/include/naucrates/traceflags/traceflags.h b/src/backend/gporca/libnaucrates/include/naucrates/traceflags/traceflags.h
index 042869c1f5..d1bc807e8d 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/traceflags/traceflags.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/traceflags/traceflags.h
@@ -210,11 +210,14 @@ enum EOptTraceFlag
 	// Use legacy (cdbhash) opfamilies for compatibility
 	EopttraceUseLegacyOpfamilies = 103039,
 
-	// enable NL Left Join plan alternatives where inner child is redistributed if possible
+	// Enable NL Left Join plan alternatives where inner child is redistributed if possible
 	EopttraceEnableRedistributeNLLOJInnerChild = 103040,
 
 	EopttraceForceComprehensiveJoinImplementation = 103041,
 
+	// Enable use the distribution key in DQA
+	EopttraceEnableUseDistributionInDQA = 103042,
+
 	///////////////////////////////////////////////////////
 	///////////////////// statistics flags ////////////////
 	//////////////////////////////////////////////////////
diff --git a/src/backend/utils/misc/guc_gp.c b/src/backend/utils/misc/guc_gp.c
index 35e7078ff9..c1ef312f75 100644
--- a/src/backend/utils/misc/guc_gp.c
+++ b/src/backend/utils/misc/guc_gp.c
@@ -405,6 +405,7 @@ bool		optimizer_enable_space_pruning;
 bool		optimizer_enable_associativity;
 bool		optimizer_enable_eageragg;
 bool		optimizer_enable_range_predicate_dpe;
+bool		optimizer_enable_use_distribution_in_dqa;
 
 /* Analyze related GUCs for Optimizer */
 bool		optimizer_analyze_root_partition;
@@ -2952,6 +2953,17 @@ struct config_bool ConfigureNamesBool_gp[] =
 		NULL, NULL, NULL
 	},
 
+	{
+		{"optimizer_enable_use_distribution_in_dqa", PGC_USERSET, DEVELOPER_OPTIONS,
+			gettext_noop("Enable use the distribution key in DQA"),
+			NULL,
+			GUC_NO_SHOW_ALL | GUC_NOT_IN_SAMPLE
+		},
+		&optimizer_enable_use_distribution_in_dqa,
+		false,
+		NULL, NULL, NULL
+	},
+
 	{
 		{"gp_pause_on_restore_point_replay", PGC_SIGHUP, DEVELOPER_OPTIONS,
 		 gettext_noop("Pause recovery when a restore point is replayed."),
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index f8a715632c..512b43b065 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -584,6 +584,7 @@ extern bool optimizer_cte_inlining;
 extern bool optimizer_enable_space_pruning;
 extern bool optimizer_enable_associativity;
 extern bool optimizer_enable_range_predicate_dpe;
+extern bool optimizer_enable_use_distribution_in_dqa;
 
 /* Analyze related GUCs for Optimizer */
 extern bool optimizer_analyze_root_partition;
diff --git a/src/include/utils/unsync_guc_name.h b/src/include/utils/unsync_guc_name.h
index 2e74fc61ea..4f23d394e1 100644
--- a/src/include/utils/unsync_guc_name.h
+++ b/src/include/utils/unsync_guc_name.h
@@ -423,6 +423,7 @@
 		"optimizer_enable_partition_propagation",
 		"optimizer_enable_partition_selection",
 		"optimizer_enable_range_predicate_dpe",
+		"optimizer_enable_use_distribution_in_dqa",
 		"optimizer_enable_redistribute_nestloop_loj_inner_child",
 		"optimizer_enable_replicated_table",
 		"optimizer_enable_sort",
diff --git a/src/test/regress/expected/gp_dqa.out b/src/test/regress/expected/gp_dqa.out
index 6fc8baf761..9090a1547a 100644
--- a/src/test/regress/expected/gp_dqa.out
+++ b/src/test/regress/expected/gp_dqa.out
@@ -2377,6 +2377,10 @@ select count(distinct a) from t_issue_659;
 (1 row)
 
 set gp_eager_distinct_dedup = on;
+-- for ORCA
+set optimizer_force_three_stage_scalar_dqa to on;
+set optimizer_force_multistage_agg to on;
+set optimizer_enable_use_distribution_in_dqa to on;
 explain(costs off)
 select count(distinct a) from t_issue_659;
                    QUERY PLAN                    
@@ -2397,4 +2401,7 @@ select count(distinct a) from t_issue_659;
 (1 row)
 
 reset gp_eager_distinct_dedup;
+reset optimizer_force_three_stage_scalar_dqa;
+reset optimizer_force_multistage_agg;
+reset optimizer_enable_use_distribution_in_dqa;
 drop table t_issue_659;
diff --git a/src/test/regress/expected/gp_dqa_optimizer.out b/src/test/regress/expected/gp_dqa_optimizer.out
index 12ee39cadd..43e023d100 100644
--- a/src/test/regress/expected/gp_dqa_optimizer.out
+++ b/src/test/regress/expected/gp_dqa_optimizer.out
@@ -2524,16 +2524,23 @@ select count(distinct a) from t_issue_659;
 (1 row)
 
 set gp_eager_distinct_dedup = on;
+-- for ORCA
+set optimizer_force_three_stage_scalar_dqa to on;
+set optimizer_force_multistage_agg to on;
+set optimizer_enable_use_distribution_in_dqa to on;
 explain(costs off)
 select count(distinct a) from t_issue_659;
-                   QUERY PLAN                   
-------------------------------------------------
- Finalize Aggregate
+                   QUERY PLAN                    
+-------------------------------------------------
+ Aggregate
    ->  Gather Motion 3:1  (slice1; segments: 3)
-         ->  Partial Aggregate
-               ->  Seq Scan on t_issue_659
+         ->  HashAggregate
+               Group Key: a
+               ->  Streaming HashAggregate
+                     Group Key: a
+                     ->  Seq Scan on t_issue_659
  Optimizer: Pivotal Optimizer (GPORCA)
-(5 rows)
+(8 rows)
 
 select count(distinct a) from t_issue_659;
  count 
@@ -2542,4 +2549,7 @@ select count(distinct a) from t_issue_659;
 (1 row)
 
 reset gp_eager_distinct_dedup;
+reset optimizer_force_three_stage_scalar_dqa;
+reset optimizer_force_multistage_agg;
+reset optimizer_enable_use_distribution_in_dqa;
 drop table t_issue_659;
diff --git a/src/test/regress/sql/gp_dqa.sql b/src/test/regress/sql/gp_dqa.sql
index a4b8a09910..65f52cd743 100644
--- a/src/test/regress/sql/gp_dqa.sql
+++ b/src/test/regress/sql/gp_dqa.sql
@@ -419,8 +419,15 @@ explain(costs off)
 select count(distinct a) from t_issue_659;
 select count(distinct a) from t_issue_659;
 set gp_eager_distinct_dedup = on;
+-- for ORCA
+set optimizer_force_three_stage_scalar_dqa to on;
+set optimizer_force_multistage_agg to on;
+set optimizer_enable_use_distribution_in_dqa to on;
 explain(costs off)
 select count(distinct a) from t_issue_659;
 select count(distinct a) from t_issue_659;
 reset gp_eager_distinct_dedup;
+reset optimizer_force_three_stage_scalar_dqa;
+reset optimizer_force_multistage_agg;
+reset optimizer_enable_use_distribution_in_dqa;
 drop table t_issue_659;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org