This is an automated email from the ASF dual-hosted git repository.

englefly 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 d7cb5cf3db [feature](nereids) add session var: dump_nereids_memo 
(#17666)
d7cb5cf3db is described below

commit d7cb5cf3db2662d1a2e5adf52ab0b920cb4b1387
Author: minghong <[email protected]>
AuthorDate: Sat Mar 11 13:40:15 2023 +0800

    [feature](nereids) add session var: dump_nereids_memo (#17666)
    
    * dump_nereids_memo
    
    * print groupexpr id
---
 .../org/apache/doris/nereids/NereidsPlanner.java     | 18 ++++++++++++++++--
 .../java/org/apache/doris/nereids/memo/Group.java    |  8 ++++----
 .../apache/doris/nereids/memo/GroupExpression.java   |  6 ++++--
 .../java/org/apache/doris/nereids/memo/Memo.java     | 20 +++++++++++++-------
 .../java/org/apache/doris/qe/SessionVariable.java    | 13 +++++++++++++
 5 files changed, 50 insertions(+), 15 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 6f35193797..6a70fbbc79 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
@@ -61,6 +61,7 @@ import org.apache.logging.log4j.Logger;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -180,10 +181,23 @@ public class NereidsPlanner extends Planner {
 
             optimize();
 
+            //print memo before choose plan.
+            //if chooseNthPlan failed, we could get memo to debug
+            if (ConnectContext.get().getSessionVariable().isDumpNereidsMemo()) 
{
+                String memo = cascadesContext.getMemo().toString();
+                LOG.info(memo);
+            }
+
             int nth = 
ConnectContext.get().getSessionVariable().getNthOptimizedPlan();
             PhysicalPlan physicalPlan = chooseNthPlan(getRoot(), 
requireProperties, nth);
 
             physicalPlan = postProcess(physicalPlan);
+
+            if (ConnectContext.get().getSessionVariable().isDumpNereidsMemo()) 
{
+                String tree = physicalPlan.treeString();
+                LOG.info(tree);
+            }
+
             if (explainLevel == ExplainLevel.OPTIMIZED_PLAN || explainLevel == 
ExplainLevel.ALL_PLAN) {
                 optimizedPlan = physicalPlan;
             }
@@ -293,8 +307,8 @@ public class NereidsPlanner extends Planner {
             if (!(plan instanceof PhysicalPlan)) {
                 throw new AnalysisException("Result plan must be 
PhysicalPlan");
             }
-
-            // TODO: set (logical and physical)properties/statistics/... for 
physicalPlan.
+            // add groupExpression to plan so that we could print group id in 
plan.treeString()
+            plan = plan.withGroupExpression(Optional.of(groupExpression));
             PhysicalPlan physicalPlan = ((PhysicalPlan) 
plan).withPhysicalPropertiesAndStats(
                     groupExpression.getOutputProperties(physicalProperties),
                     groupExpression.getOwnerGroup().getStatistics());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java
index 36fe488e6c..8e1720fd14 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java
@@ -397,13 +397,13 @@ public class Group {
     @Override
     public String toString() {
         StringBuilder str = new StringBuilder("Group[" + groupId + "]\n");
-        str.append("logical expressions:\n");
+        str.append("  logical expressions:\n");
         for (GroupExpression logicalExpression : logicalExpressions) {
-            str.append("  ").append(logicalExpression).append("\n");
+            str.append("    ").append(logicalExpression).append("\n");
         }
-        str.append("physical expressions:\n");
+        str.append("  physical expressions:\n");
         for (GroupExpression physicalExpression : physicalExpressions) {
-            str.append("  ").append(physicalExpression).append("\n");
+            str.append("    ").append(physicalExpression).append("\n");
         }
         return str.toString();
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/GroupExpression.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/GroupExpression.java
index efc35bc5d4..f9f7fef2d7 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/GroupExpression.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/GroupExpression.java
@@ -36,6 +36,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
+import java.text.DecimalFormat;
 import java.util.BitSet;
 import java.util.List;
 import java.util.Map;
@@ -318,8 +319,9 @@ public class GroupExpression {
             builder.append("#").append(ownerGroup.getGroupId().asInt());
         }
 
-        builder.append(" cost=").append((long) cost);
-
+        DecimalFormat decimalFormat = new DecimalFormat();
+        decimalFormat.setGroupingSize(3);
+        builder.append(" cost=").append(decimalFormat.format((long) cost));
         builder.append(" estRows=").append(estOutputRowCount);
         builder.append(" (plan=").append(plan.toString()).append(") 
children=[");
         for (Group group : children) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java
index acb2cf1296..b1adb4cf05 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java
@@ -693,7 +693,7 @@ public class Memo {
         StringBuilder builder = new StringBuilder();
         builder.append("root:").append(getRoot()).append("\n");
         for (Group group : groups.values()) {
-            builder.append(group).append("\n");
+            builder.append("\n\n").append(group);
             builder.append("  
stats=").append(group.getStatistics()).append("\n");
             StatsDeriveResult stats = group.getStatistics();
             if (stats != null && !group.getLogicalExpressions().isEmpty()
@@ -702,12 +702,18 @@ public class Memo {
                     builder.append("    
").append(e.getKey()).append(":").append(e.getValue()).append("\n");
                 }
             }
-            for (GroupExpression groupExpression : 
group.getLogicalExpressions()) {
-                builder.append("  
").append(groupExpression.toString()).append("\n");
-            }
-            for (GroupExpression groupExpression : 
group.getPhysicalExpressions()) {
-                builder.append("  
").append(groupExpression.toString()).append("\n");
-            }
+
+            builder.append("  lowest Plan(cost, properties, plan)");
+            group.getAllProperties().forEach(
+                    prop -> {
+                        Optional<Pair<Cost, GroupExpression>> 
costAndGroupExpression = group.getLowestCostPlan(prop);
+                        if (costAndGroupExpression.isPresent()) {
+                            builder.append("\n    " + 
costAndGroupExpression.get().first.getValue() + " " + prop)
+                                    .append("\n     
").append(costAndGroupExpression.get().second);
+                        }
+                    }
+            );
+            builder.append("\n");
         }
         return builder.toString();
     }
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 1133cf6807..ad471791ea 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
@@ -283,6 +283,8 @@ public class SessionVariable implements Serializable, 
Writable {
 
     public static final String SHOW_USER_DEFAULT_ROLE = 
"show_user_default_role";
 
+    public static final String DUMP_NEREIDS_MEMO = "dump_nereids_memo";
+
     // fix replica to query. If num = 1, query the smallest replica, if 2 is 
the second smallest replica.
     public static final String USE_FIX_REPLICA = "use_fix_replica";
 
@@ -760,6 +762,9 @@ public class SessionVariable implements Serializable, 
Writable {
     @VariableMgr.VarAttr(name = USE_FIX_REPLICA)
     public int useFixReplica = -1;
 
+    @VariableMgr.VarAttr(name = DUMP_NEREIDS_MEMO)
+    public boolean dumpNereidsMemo = false;
+
     // If set to true, all query will be executed without returning result
     @VariableMgr.VarAttr(name = DRY_RUN_QUERY, needForward = true)
     public boolean dryRunQuery = false;
@@ -1847,4 +1852,12 @@ public class SessionVariable implements Serializable, 
Writable {
         }
         return "";
     }
+
+    public boolean isDumpNereidsMemo() {
+        return dumpNereidsMemo;
+    }
+
+    public void setDumpNereidsMemo(boolean dumpNereidsMemo) {
+        this.dumpNereidsMemo = dumpNereidsMemo;
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to