From fb385dcf2378e54932236d74df4f216a42cc51e9 Mon Sep 17 00:00:00 2001 From: minghong Date: Wed, 23 Nov 2022 14:14:20 +0800 Subject: [PATCH] [opt](nereids) make fragment id in explain get inline with profile (#14421) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nereids assign fragment ID in its own way. The fragment Id in explain is different from the fragment id in profile. This difference makes trouble to understand profile. This pr aims to print fragment id in explain the same as that in profile.ยท --- .../doris/common/profile/PlanTreeBuilder.java | 2 +- .../apache/doris/nereids/NereidsPlanner.java | 4 +++- .../org/apache/doris/planner/PlanFragment.java | 18 ++++++++++++++++++ .../org/apache/doris/planner/PlanNode.java | 6 +++++- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/profile/PlanTreeBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/common/profile/PlanTreeBuilder.java index beecbd6263..eb38be4a07 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/profile/PlanTreeBuilder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/profile/PlanTreeBuilder.java @@ -62,7 +62,7 @@ public class PlanTreeBuilder { } else { sb.append("[").append(sink.getClass().getSimpleName()).append("]"); } - sb.append("\n[Fragment: ").append(fragment.getId().asInt()).append("]"); + sb.append("\n[Fragment: ").append(fragment.getFragmentSequenceNum()).append("]"); sb.append("\n").append(sink.getExplainString("", TExplainLevel.BRIEF)); sinkNode = new PlanTreeNode(sink.getExchNodeId(), sb.toString()); if (i == 0) { 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 08157e5c62..34a088d799 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 @@ -104,7 +104,9 @@ public class NereidsPlanner extends Planner { scanNodeList = planTranslatorContext.getScanNodes(); descTable = planTranslatorContext.getDescTable(); fragments = new ArrayList<>(planTranslatorContext.getPlanFragments()); - + for (int seq = 0; seq < fragments.size(); seq++) { + fragments.get(seq).setFragmentSequenceNum(seq); + } // set output exprs logicalPlanAdapter.setResultExprs(root.getOutputExprs()); ArrayList columnLabelList = physicalPlan.getOutput().stream().map(NamedExpression::getName) diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanFragment.java b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanFragment.java index e3fb413d1a..7cc059ed47 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanFragment.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanFragment.java @@ -83,6 +83,12 @@ public class PlanFragment extends TreeNode { // id for this plan fragment private PlanFragmentId fragmentId; + // nereids planner and original planner generate fragments in different order. + // This makes nereids fragment id different from that of original planner, and + // hence different from that in profile. + // in original planner, fragmentSequenceNum is fragmentId, and in nereids planner, + // fragmentSequenceNum is the id displayed in profile + private int fragmentSequenceNum; // private PlanId planId_; // private CohortId cohortId_; @@ -414,4 +420,16 @@ public class PlanFragment extends TreeNode { public boolean isTransferQueryStatisticsWithEveryBatch() { return transferQueryStatisticsWithEveryBatch; } + + public int getFragmentSequenceNum() { + if (ConnectContext.get().getSessionVariable().isEnableNereidsPlanner()) { + return fragmentSequenceNum; + } else { + return fragmentId.asInt(); + } + } + + public void setFragmentSequenceNum(int seq) { + fragmentSequenceNum = seq; + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java index 9df9370245..12de135994 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/PlanNode.java @@ -235,6 +235,10 @@ public abstract class PlanNode extends TreeNode implements PlanStats { return fragment.getFragmentId(); } + public int getFragmentSeqenceNum() { + return fragment.getFragmentSequenceNum(); + } + public void setFragmentId(PlanFragmentId id) { fragmentId = id; } @@ -887,7 +891,7 @@ public abstract class PlanNode extends TreeNode implements PlanStats { public String getPlanTreeExplainStr() { StringBuilder sb = new StringBuilder(); sb.append("[").append(getId().asInt()).append(": ").append(getPlanNodeName()).append("]"); - sb.append("\n[Fragment: ").append(getFragmentId().asInt()).append("]"); + sb.append("\n[Fragment: ").append(getFragmentSeqenceNum()).append("]"); sb.append("\n").append(getNodeExplainString("", TExplainLevel.BRIEF)); return sb.toString(); }