From 159344792f8eeaa0054f3fa15a0d4341f5424834 Mon Sep 17 00:00:00 2001 From: jakevin Date: Fri, 5 May 2023 19:58:24 +0800 Subject: [PATCH] [enhance](Nereids) make getExplorationRule static (#19278) make getExplorationRule static to avoid new ArrayList() multiple times. --- .../apache/doris/nereids/NereidsPlanner.java | 10 +++--- .../doris/nereids/StatementContext.java | 4 --- .../jobs/joinorder/hypergraph/Node.java | 8 ++--- .../hypergraph/SubgraphEnumerator.java | 4 +-- .../hypergraph/receiver/PlanReceiver.java | 10 +----- .../apache/doris/nereids/rules/RuleSet.java | 35 +++++++++++-------- .../org/apache/doris/qe/SessionVariable.java | 10 +----- 7 files changed, 31 insertions(+), 50 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java index b14f7a67c3..4235a96bb5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java @@ -278,7 +278,6 @@ public class NereidsPlanner extends Planner { CopyInResult copyInResult = cascadesContext.getMemo().copyIn(plan, null, false); root = copyInResult.correspondingExpression.getOwnerGroup(); } - cascadesContext.getStatementContext().setDpHyp(true); cascadesContext.pushJob(new JoinOrderJob(root, cascadesContext.getCurrentJobContext())); cascadesContext.getJobScheduler().executeJobPool(cascadesContext); } @@ -289,10 +288,11 @@ public class NereidsPlanner extends Planner { * try to find best plan under the guidance of statistic information and cost model. */ private void optimize() { - if (!statementContext.getConnectContext().getSessionVariable().isDisableJoinReorder() - && statementContext.getConnectContext().getSessionVariable().isEnableDPHypOptimizer() - && statementContext.getMaxNAryInnerJoin() > statementContext.getConnectContext() - .getSessionVariable().getMaxTableCountUseCascadesJoinReorder()) { + boolean isDpHyp = statementContext.getConnectContext().getSessionVariable().enableDPHypOptimizer + || statementContext.getMaxNAryInnerJoin() > statementContext.getConnectContext() + .getSessionVariable().getMaxTableCountUseCascadesJoinReorder(); + cascadesContext.getStatementContext().setDpHyp(isDpHyp); + if (!statementContext.getConnectContext().getSessionVariable().isDisableJoinReorder() && isDpHyp) { dpHypOptimize(); } new CascadesOptimizer(cascadesContext).execute(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java index 7a764941db..e9487a4f95 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java @@ -103,10 +103,6 @@ public class StatementContext { isDpHyp = dpHyp; } - public StatementBase getParsedStatement() { - return parsedStatement; - } - public ExprId getNextExprId() { return exprIdGenerator.getNextId(); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/Node.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/Node.java index 7a3854431c..599db01987 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/Node.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/Node.java @@ -29,8 +29,8 @@ import java.util.List; */ public class Node { private final int index; - private Group group; - private List edges = new ArrayList<>(); + private final Group group; + private final List edges = new ArrayList<>(); public Node(int index, Group group) { this.group = group; @@ -41,10 +41,6 @@ public class Node { return edges; } - public void replaceGroupWith(Group group) { - this.group = group; - } - public int getIndex() { return index; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/SubgraphEnumerator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/SubgraphEnumerator.java index 342f1bd1d8..8230353069 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/SubgraphEnumerator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/SubgraphEnumerator.java @@ -30,8 +30,8 @@ import java.util.List; /** * This class enumerate all subgraph of HyperGraph. CSG means connected subgraph - * and CMP means complement subgraph. More details are in Dynamic Programming - * Strikes Back and Build Query Optimizer. + * and CMP means complement subgraph. + * More details are in Paper: Dynamic Programming Strikes Back and Build Query Optimizer. */ public class SubgraphEnumerator { //The receiver receives the csg and cmp and record them, named DPTable in paper diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java index e7f9dea653..ad6e8a3252 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java @@ -77,14 +77,6 @@ public class PlanReceiver implements AbstractReceiver { HyperGraph hyperGraph; final Set finalOutputs; - public PlanReceiver() { - throw new RuntimeException(""); - } - - public PlanReceiver(int limit) { - throw new RuntimeException(""); - } - public PlanReceiver(JobContext jobContext, int limit, HyperGraph hyperGraph, Set outputs) { this.jobContext = jobContext; this.limit = limit; @@ -179,7 +171,7 @@ public class PlanReceiver implements AbstractReceiver { BitSet usedEdgesBitmap = new BitSet(); usedEdgesBitmap.or(usdEdges.get(left)); usedEdgesBitmap.or(usdEdges.get(right)); - edges.stream().forEach(edge -> usedEdgesBitmap.set(edge.getIndex())); + edges.forEach(edge -> usedEdgesBitmap.set(edge.getIndex())); long allReferenceNodes = getAllReferenceNodes(usedEdgesBitmap); // check all edges diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java index 19bd3e3bd9..8b9fb527d8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleSet.java @@ -81,7 +81,6 @@ import org.apache.doris.nereids.rules.rewrite.logical.PushdownProjectThroughLimi import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; -import java.util.ArrayList; import java.util.List; /** @@ -168,27 +167,33 @@ public class RuleSet { .add(OuterJoinAssocProject.INSTANCE) .build(); + public static final List otherReorderRules = ImmutableList.builder() + .addAll(OTHER_REORDER_RULES) + .addAll(EXPLORATION_RULES) + .build(); + + public static final List ZIG_ZAG_TREE_JOIN_REORDER_RULES = ImmutableList.builder() + .addAll(ZIG_ZAG_TREE_JOIN_REORDER) + .addAll(OTHER_REORDER_RULES) + .addAll(EXPLORATION_RULES) + .build(); + + public static final List BUSHY_TREE_JOIN_REORDER_RULES = ImmutableList.builder() + .addAll(BUSHY_TREE_JOIN_REORDER) + .addAll(OTHER_REORDER_RULES) + .addAll(EXPLORATION_RULES) + .build(); + public List getOtherReorderRules() { - List rules = new ArrayList<>(); - rules.addAll(OTHER_REORDER_RULES); - rules.addAll(EXPLORATION_RULES); - return rules; + return otherReorderRules; } public List getZigZagTreeJoinReorder() { - List rules = new ArrayList<>(); - rules.addAll(ZIG_ZAG_TREE_JOIN_REORDER); - rules.addAll(OTHER_REORDER_RULES); - rules.addAll(EXPLORATION_RULES); - return rules; + return ZIG_ZAG_TREE_JOIN_REORDER_RULES; } public List getBushyTreeJoinReorder() { - List rules = new ArrayList<>(); - rules.addAll(BUSHY_TREE_JOIN_REORDER); - rules.addAll(OTHER_REORDER_RULES); - rules.addAll(EXPLORATION_RULES); - return rules; + return BUSHY_TREE_JOIN_REORDER_RULES; } public List getImplementationRules() { 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 00fb85e17c..0ff85cc185 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 @@ -612,7 +612,7 @@ public class SessionVariable implements Serializable, Writable { private boolean checkOverflowForDecimal = false; @VariableMgr.VarAttr(name = ENABLE_DPHYP_OPTIMIZER) - private boolean enableDPHypOptimizer = false; + public boolean enableDPHypOptimizer = false; /** * This variable is used to select n-th optimized plan in memo. @@ -1550,18 +1550,10 @@ public class SessionVariable implements Serializable, Writable { this.enableNereidsPlanner = enableNereidsPlanner; } - public boolean isEnableDPHypOptimizer() { - return isEnableNereidsPlanner() && enableDPHypOptimizer; - } - public int getNthOptimizedPlan() { return nthOptimizedPlan; } - public void setEnableDphypOptimizer(boolean enableDPHypOptimizer) { - this.enableDPHypOptimizer = enableDPHypOptimizer; - } - public Set getDisableNereidsRules() { return Arrays.stream(disableNereidsRules.split(",[\\s]*")) .map(rule -> rule.toUpperCase(Locale.ROOT))