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]