This is an automated email from the ASF dual-hosted git repository. jakevin pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 080d613238 [enhancement](Nereids): speed up rewrite() (#22846) 080d613238 is described below commit 080d613238e5683e0a842b014ec535d8510de05a Author: jakevin <jakevin...@gmail.com> AuthorDate: Fri Aug 11 13:04:30 2023 +0800 [enhancement](Nereids): speed up rewrite() (#22846) - use Set<Integer> instead of Set<String> to speedup `contains` - remove `getValidRules` and use `if` in `for` to avoid `toImmutableList` --- .../java/org/apache/doris/nereids/jobs/Job.java | 34 ++-------------------- .../jobs/cascades/OptimizeGroupExpressionJob.java | 10 +++++-- .../nereids/jobs/rewrite/CustomRewriteJob.java | 5 ++-- .../nereids/jobs/rewrite/PlanTreeRewriteJob.java | 6 ++-- .../nereids/jobs/rewrite/RewriteBottomUpJob.java | 6 ++-- .../nereids/jobs/rewrite/RewriteTopDownJob.java | 6 ++-- .../java/org/apache/doris/nereids/rules/Rule.java | 11 +++++++ .../rules/rewrite/PushdownCountThroughJoin.java | 2 +- .../java/org/apache/doris/qe/SessionVariable.java | 11 ++++++- .../org/apache/doris/nereids/util/PlanChecker.java | 2 +- .../apache/doris/utframe/TestWithFeService.java | 2 +- 11 files changed, 48 insertions(+), 47 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/Job.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/Job.java index 05e7f803d2..14d9fbc754 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/Job.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/Job.java @@ -37,12 +37,10 @@ import org.apache.doris.qe.SessionVariable; import org.apache.doris.statistics.Statistics; import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Optional; import java.util.Set; @@ -58,7 +56,7 @@ public abstract class Job implements TracerSupplier { protected JobType type; protected JobContext context; protected boolean once; - protected final Set<String> disableRules; + protected final Set<Integer> disableRules; protected Map<CTEId, Statistics> cteIdToStats; @@ -86,29 +84,6 @@ public abstract class Job implements TracerSupplier { return once; } - /** - * Get the rule set of this job. Filter out already applied rules and rules that are not matched on root node. - * - * @param groupExpression group expression to be applied on - * @param candidateRules rules to be applied - * @return all rules that can be applied on this group expression - */ - public List<Rule> getValidRules(GroupExpression groupExpression, List<Rule> candidateRules) { - return candidateRules.stream() - .filter(rule -> Objects.nonNull(rule) - && !disableRules.contains(rule.getRuleType().name()) - && rule.getPattern().matchRoot(groupExpression.getPlan()) - && groupExpression.notApplied(rule)) - .collect(ImmutableList.toImmutableList()); - } - - public List<Rule> getValidRules(List<Rule> candidateRules) { - return candidateRules.stream() - .filter(rule -> Objects.nonNull(rule) - && !disableRules.contains(rule.getRuleType().name())) - .collect(ImmutableList.toImmutableList()); - } - public abstract void execute(); public EventProducer getEventTracer() { @@ -149,13 +124,8 @@ public abstract class Job implements TracerSupplier { groupExpression.getOwnerGroup(), groupExpression, groupExpression.getPlan())); } - public static Set<String> getDisableRules(JobContext context) { + public static Set<Integer> getDisableRules(JobContext context) { return context.getCascadesContext().getAndCacheSessionVariable( "disableNereidsRules", ImmutableSet.of(), SessionVariable::getDisableNereidsRules); } - - public static boolean isTraceEnable(JobContext context) { - return context.getCascadesContext().getAndCacheSessionVariable( - "isTraceEnable", false, SessionVariable::isEnableNereidsTrace); - } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/OptimizeGroupExpressionJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/OptimizeGroupExpressionJob.java index 50175125ab..c56b808b7d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/OptimizeGroupExpressionJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/OptimizeGroupExpressionJob.java @@ -43,11 +43,17 @@ public class OptimizeGroupExpressionJob extends Job { List<Rule> implementationRules = getRuleSet().getImplementationRules(); List<Rule> explorationRules = getExplorationRules(); - for (Rule rule : getValidRules(groupExpression, explorationRules)) { + for (Rule rule : explorationRules) { + if (rule.isInvalid(disableRules, groupExpression)) { + continue; + } pushJob(new ApplyRuleJob(groupExpression, rule, context)); } - for (Rule rule : getValidRules(groupExpression, implementationRules)) { + for (Rule rule : implementationRules) { + if (rule.isInvalid(disableRules, groupExpression)) { + continue; + } pushJob(new ApplyRuleJob(groupExpression, rule, context)); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/CustomRewriteJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/CustomRewriteJob.java index bfd602c4cf..4b9f8abca9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/CustomRewriteJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/CustomRewriteJob.java @@ -23,7 +23,6 @@ import org.apache.doris.nereids.rules.RuleType; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.visitor.CustomRewriter; -import java.util.Locale; import java.util.Objects; import java.util.Set; import java.util.function.Supplier; @@ -49,8 +48,8 @@ public class CustomRewriteJob implements RewriteJob { @Override public void execute(JobContext context) { - Set<String> disableRules = Job.getDisableRules(context); - if (disableRules.contains(ruleType.name().toUpperCase(Locale.ROOT))) { + Set<Integer> disableRules = Job.getDisableRules(context); + if (disableRules.contains(ruleType.type())) { return; } Plan root = context.getCascadesContext().getRewritePlan(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/PlanTreeRewriteJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/PlanTreeRewriteJob.java index 83f48b7e1f..0fa7e772c1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/PlanTreeRewriteJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/PlanTreeRewriteJob.java @@ -42,8 +42,10 @@ public abstract class PlanTreeRewriteJob extends Job { boolean isRewriteRoot = rewriteJobContext.isRewriteRoot(); CascadesContext cascadesContext = context.getCascadesContext(); cascadesContext.setIsRewriteRoot(isRewriteRoot); - List<Rule> validRules = getValidRules(rules); - for (Rule rule : validRules) { + for (Rule rule : rules) { + if (disableRules.contains(rule.getRuleType().type())) { + continue; + } Pattern<Plan> pattern = (Pattern<Plan>) rule.getPattern(); if (pattern.matchPlanTree(plan)) { List<Plan> newPlans = rule.transform(plan, cascadesContext); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/RewriteBottomUpJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/RewriteBottomUpJob.java index 6c7374ac4c..ff1e4c7801 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/RewriteBottomUpJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/RewriteBottomUpJob.java @@ -87,8 +87,10 @@ public class RewriteBottomUpJob extends Job { } countJobExecutionTimesOfGroupExpressions(logicalExpression); - List<Rule> validRules = getValidRules(logicalExpression, rules); - for (Rule rule : validRules) { + for (Rule rule : rules) { + if (rule.isInvalid(disableRules, logicalExpression)) { + continue; + } GroupExpressionMatching groupExpressionMatching = new GroupExpressionMatching(rule.getPattern(), logicalExpression); for (Plan before : groupExpressionMatching) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/RewriteTopDownJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/RewriteTopDownJob.java index 274b460e3a..c0f2f784da 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/RewriteTopDownJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/rewrite/RewriteTopDownJob.java @@ -84,8 +84,10 @@ public class RewriteTopDownJob extends Job { public void execute() { GroupExpression logicalExpression = group.getLogicalExpression(); countJobExecutionTimesOfGroupExpressions(logicalExpression); - List<Rule> validRules = getValidRules(logicalExpression, rules); - for (Rule rule : validRules) { + for (Rule rule : rules) { + if (rule.isInvalid(disableRules, logicalExpression)) { + continue; + } Preconditions.checkArgument(rule.isRewrite(), "rules must be rewritable in top down job"); GroupExpressionMatching groupExpressionMatching diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/Rule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/Rule.java index 25cba46002..a9b4591ad4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/Rule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/Rule.java @@ -19,11 +19,13 @@ package org.apache.doris.nereids.rules; import org.apache.doris.nereids.CascadesContext; import org.apache.doris.nereids.exceptions.TransformException; +import org.apache.doris.nereids.memo.GroupExpression; import org.apache.doris.nereids.pattern.Pattern; import org.apache.doris.nereids.rules.RuleType.RuleTypeClass; import org.apache.doris.nereids.trees.plans.Plan; import java.util.List; +import java.util.Set; /** * Abstract class for all rules. @@ -73,4 +75,13 @@ public abstract class Rule { public void acceptPlan(Plan plan) { } + + /** + * Filter out already applied rules and rules that are not matched on root node. + */ + public boolean isInvalid(Set<Integer> disableRules, GroupExpression groupExpression) { + return disableRules.contains(this.getRuleType().type()) + || !groupExpression.notApplied(this) + || !this.getPattern().matchRoot(groupExpression.getPlan()); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownCountThroughJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownCountThroughJoin.java index 4f0f63e547..5bef7842a5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownCountThroughJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownCountThroughJoin.java @@ -64,7 +64,7 @@ import java.util.Set; * | aggregate: count(*) as cntStar * aggregate: count(x) as cnt * </pre> - * Notice: when Count(*) exists, group by mustn't be empty. + * Notice: rule can't optimize condition that groupby is empty when Count(*) exists. */ public class PushdownCountThroughJoin implements RewriteRuleFactory { @Override diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java index bc2d8fc97e..5b69a1a3ce 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java @@ -28,6 +28,7 @@ import org.apache.doris.common.io.Writable; import org.apache.doris.common.util.TimeUtils; import org.apache.doris.nereids.metrics.Event; import org.apache.doris.nereids.metrics.EventSwitchParser; +import org.apache.doris.nereids.rules.RuleType; import org.apache.doris.qe.VariableMgr.VarAttr; import org.apache.doris.thrift.TQueryOptions; import org.apache.doris.thrift.TResourceLimit; @@ -1944,12 +1945,20 @@ public class SessionVariable implements Serializable, Writable { return nthOptimizedPlan; } - public Set<String> getDisableNereidsRules() { + public Set<String> getDisableNereidsRuleNames() { return Arrays.stream(disableNereidsRules.split(",[\\s]*")) .map(rule -> rule.toUpperCase(Locale.ROOT)) .collect(ImmutableSet.toImmutableSet()); } + public Set<Integer> getDisableNereidsRules() { + return Arrays.stream(disableNereidsRules.split(",[\\s]*")) + .filter(rule -> !rule.isEmpty()) + .map(rule -> rule.toUpperCase(Locale.ROOT)) + .map(rule -> RuleType.valueOf(rule).type()) + .collect(ImmutableSet.toImmutableSet()); + } + public void setEnableNewCostModel(boolean enable) { this.enableNewCostModel = enable; } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/PlanChecker.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/PlanChecker.java index 4e4f7ad270..254b6d5a98 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/PlanChecker.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/PlanChecker.java @@ -128,7 +128,7 @@ public class PlanChecker { public PlanChecker analyze(Plan plan) { this.cascadesContext = MemoTestUtils.createCascadesContext(connectContext, plan); - Set<String> originDisableRules = connectContext.getSessionVariable().getDisableNereidsRules(); + Set<String> originDisableRules = connectContext.getSessionVariable().getDisableNereidsRuleNames(); Set<String> disableRuleWithAuth = Sets.newHashSet(originDisableRules); disableRuleWithAuth.add(RuleType.RELATION_AUTHENTICATION.name()); connectContext.getSessionVariable().setDisableNereidsRules(String.join(",", disableRuleWithAuth)); diff --git a/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java b/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java index d6b69742ef..f14966de5a 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java +++ b/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java @@ -194,7 +194,7 @@ public abstract class TestWithFeService { } public LogicalPlan analyze(String sql) { - Set<String> originDisableRules = connectContext.getSessionVariable().getDisableNereidsRules(); + Set<String> originDisableRules = connectContext.getSessionVariable().getDisableNereidsRuleNames(); Set<String> disableRuleWithAuth = Sets.newHashSet(originDisableRules); disableRuleWithAuth.add(RuleType.RELATION_AUTHENTICATION.name()); connectContext.getSessionVariable().setDisableNereidsRules(String.join(",", disableRuleWithAuth)); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org