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

lihaopeng pushed a commit to branch opt_perf
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/opt_perf by this push:
     new 8098eb5dcc [Opt](agg) enable_single_distinct_column_opt do not 
effective in not group by (#12935)
8098eb5dcc is described below

commit 8098eb5dcc99237bf49c957e1b0453cf53264820
Author: HappenLee <[email protected]>
AuthorDate: Sat Sep 24 10:49:25 2022 +0800

    [Opt](agg) enable_single_distinct_column_opt do not effective in not group 
by (#12935)
---
 .../main/java/org/apache/doris/analysis/AggregateInfo.java | 14 +++++++++-----
 .../main/java/org/apache/doris/analysis/SelectStmt.java    |  6 +++---
 2 files changed, 12 insertions(+), 8 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/AggregateInfo.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/AggregateInfo.java
index d4137f148e..caa1d66b63 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AggregateInfo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AggregateInfo.java
@@ -203,7 +203,8 @@ public final class AggregateInfo extends AggregateInfoBase {
         // 1: if aggExprs don't have distinct or have multi distinct , create 
aggregate info for
         // one stage aggregation.
         // 2: if aggExprs have one distinct , create aggregate info for two 
stage aggregation
-        boolean isUsingSetForDistinct = 
estimateIfUsingSetForDistinct(distinctAggExprs);
+        boolean isUsingSetForDistinct = 
estimateIfUsingSetForDistinct(distinctAggExprs,
+                !groupingExprs.isEmpty());
         if (distinctAggExprs.isEmpty() || isUsingSetForDistinct) {
             // It is used to map new aggr expr to old expr to help create an 
external
             // reference to the aggregation node tuple
@@ -249,22 +250,25 @@ public final class AggregateInfo extends 
AggregateInfoBase {
 
 
     // note(wb): in some cases, using hashset for distinct is better
-    public static boolean isSetUsingSetForDistinct(List<FunctionCallExpr> 
distinctAggExprs) {
+    public static boolean isSetUsingSetForDistinct(List<FunctionCallExpr> 
distinctAggExprs,
+                                                   boolean haveGrouping) {
         boolean isSetUsingSetForDistinct = false;
         // for vectorized execution, we force it to using hash set to execution
         if (distinctAggExprs.size() == 1
                 && distinctAggExprs.get(0).getFnParams().isDistinct()
                 && VectorizedUtil.isVectorized()
+                && haveGrouping
                 && 
ConnectContext.get().getSessionVariable().enableSingleDistinctColumnOpt()) {
             isSetUsingSetForDistinct = true;
         }
         return isSetUsingSetForDistinct;
     }
 
-    public static boolean estimateIfUsingSetForDistinct(List<FunctionCallExpr> 
distinctAggExprs)
+    public static boolean estimateIfUsingSetForDistinct(List<FunctionCallExpr> 
distinctAggExprs,
+                                                        boolean haveGrouping)
             throws AnalysisException {
         return estimateIfContainsMultiDistinct(distinctAggExprs)
-                || isSetUsingSetForDistinct(distinctAggExprs);
+                || isSetUsingSetForDistinct(distinctAggExprs, haveGrouping);
     }
 
     /**
@@ -367,7 +371,7 @@ public final class AggregateInfo extends AggregateInfoBase {
             }
         }
 
-        this.isUsingSetForDistinct = 
estimateIfUsingSetForDistinct(distinctAggExprs);
+        this.isUsingSetForDistinct = 
estimateIfUsingSetForDistinct(distinctAggExprs, !groupingExprs.isEmpty());
 
         // add DISTINCT parameters to grouping exprs
         if (!isUsingSetForDistinct) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
index e29a68d375..97f7318275 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
@@ -1048,7 +1048,7 @@ public class SelectStmt extends QueryStmt {
         // ii) Other DISTINCT aggregates are present.
         ExprSubstitutionMap countAllMap = createCountAllMap(aggExprs, 
analyzer);
         final ExprSubstitutionMap multiCountOrSumDistinctMap =
-                createSumOrCountMultiDistinctSMap(aggExprs, analyzer);
+                createSumOrCountMultiDistinctSMap(aggExprs, groupByClause != 
null, analyzer);
         countAllMap = ExprSubstitutionMap.compose(multiCountOrSumDistinctMap, 
countAllMap, analyzer);
         List<Expr> substitutedAggs =
                 Expr.substituteList(aggExprs, countAllMap, analyzer, false);
@@ -1175,7 +1175,7 @@ public class SelectStmt extends QueryStmt {
      * assumes that select list and having clause have been analyzed.
      */
     private ExprSubstitutionMap createSumOrCountMultiDistinctSMap(
-            ArrayList<FunctionCallExpr> aggExprs, Analyzer analyzer) throws 
AnalysisException {
+            ArrayList<FunctionCallExpr> aggExprs, boolean haveGrouping, 
Analyzer analyzer) throws AnalysisException {
         final List<FunctionCallExpr> distinctExprs = Lists.newArrayList();
         for (FunctionCallExpr aggExpr : aggExprs) {
             if (aggExpr.isDistinct()) {
@@ -1183,7 +1183,7 @@ public class SelectStmt extends QueryStmt {
             }
         }
         final ExprSubstitutionMap result = new ExprSubstitutionMap();
-        final boolean isUsingSetForDistinct = 
AggregateInfo.estimateIfUsingSetForDistinct(distinctExprs);
+        final boolean isUsingSetForDistinct = 
AggregateInfo.estimateIfUsingSetForDistinct(distinctExprs, haveGrouping);
         if (!isUsingSetForDistinct) {
             return result;
         }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to