This is an automated email from the ASF dual-hosted git repository. kxiao pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 0fb935d47540ec3ca75fd4bdd88e8e526b85688c Author: airborne12 <airborn...@gmail.com> AuthorDate: Thu Sep 21 20:30:27 2023 +0800 [Improve](count on index) improve performance for count on index other than match (#24678) --- .../rules/implementation/AggregateStrategies.java | 39 ++++++++++++---------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/AggregateStrategies.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/AggregateStrategies.java index e118c4ee9b..166ddd3bd9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/AggregateStrategies.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/AggregateStrategies.java @@ -17,8 +17,11 @@ package org.apache.doris.nereids.rules.implementation; +import org.apache.doris.analysis.IndexDef.IndexType; import org.apache.doris.catalog.Column; import org.apache.doris.catalog.KeysType; +import org.apache.doris.catalog.MaterializedIndexMeta; +import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.PrimitiveType; import org.apache.doris.common.Pair; import org.apache.doris.nereids.CascadesContext; @@ -36,7 +39,6 @@ import org.apache.doris.nereids.trees.expressions.Alias; import org.apache.doris.nereids.trees.expressions.Cast; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.IsNull; -import org.apache.doris.nereids.trees.expressions.Match; import org.apache.doris.nereids.trees.expressions.NamedExpression; import org.apache.doris.nereids.trees.expressions.SlotReference; import org.apache.doris.nereids.trees.expressions.functions.ExpressionTrait; @@ -77,7 +79,6 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -103,8 +104,8 @@ public class AggregateStrategies implements ImplementationRuleFactory { RuleType.COUNT_ON_INDEX_WITHOUT_PROJECT.build( logicalAggregate( logicalFilter( - logicalOlapScan().when(this::isDupOrMowKeyTable) - ).when(filter -> containsMatchExpression(filter.getConjuncts()))) + logicalOlapScan().when(this::isDupOrMowKeyTable).when(this::isInvertedIndexEnabledOnTable) + ).when(filter -> filter.getConjuncts().size() > 0)) .when(agg -> enablePushDownCountOnIndex()) .when(agg -> agg.getGroupByExpressions().size() == 0) .when(agg -> { @@ -123,8 +124,8 @@ public class AggregateStrategies implements ImplementationRuleFactory { logicalAggregate( logicalProject( logicalFilter( - logicalOlapScan().when(this::isDupOrMowKeyTable) - ).when(filter -> containsMatchExpression(filter.getConjuncts())))) + logicalOlapScan().when(this::isDupOrMowKeyTable).when(this::isInvertedIndexEnabledOnTable) + ).when(filter -> filter.getConjuncts().size() > 0))) .when(agg -> enablePushDownCountOnIndex()) .when(agg -> agg.getGroupByExpressions().size() == 0) .when(agg -> { @@ -230,18 +231,6 @@ public class AggregateStrategies implements ImplementationRuleFactory { ); } - private boolean containsMatchExpression(Set<Expression> expressions) { - List<Expression> exprs = new ArrayList<>(); - expressions.forEach(conjunct -> { - conjunct.getInputSlots().forEach(slot -> { - if (!slot.getName().equalsIgnoreCase(Column.DELETE_SIGN)) { - exprs.add(conjunct); - } - }); - }); - return exprs.stream().allMatch(expr -> expr instanceof Match); - } - private boolean enablePushDownCountOnIndex() { ConnectContext connectContext = ConnectContext.get(); return connectContext != null && connectContext.getSessionVariable().isEnablePushDownCountOnIndex(); @@ -256,6 +245,20 @@ public class AggregateStrategies implements ImplementationRuleFactory { return false; } + private boolean isInvertedIndexEnabledOnTable(LogicalOlapScan logicalScan) { + if (logicalScan == null) { + return false; + } + + OlapTable olapTable = logicalScan.getTable(); + Map<Long, MaterializedIndexMeta> indexIdToMeta = olapTable.getIndexIdToMeta(); + + return indexIdToMeta.values().stream() + .anyMatch(indexMeta -> indexMeta.getIndexes().stream() + .anyMatch(index -> index.getIndexType() == IndexType.INVERTED + || index.getIndexType() == IndexType.BITMAP)); + } + /** * sql: select count(*) from tbl where column match 'token' * <p> --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org