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

morrysnow 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 e34e72dd51 [feature](Nereids) show cost and execution time for each 
plan (#17123)
e34e72dd51 is described below

commit e34e72dd51fa18140c6560f27e29e7a2add9059f
Author: 谢健 <jianx...@gmail.com>
AuthorDate: Tue Feb 28 18:59:57 2023 +0800

    [feature](Nereids) show cost and execution time for each plan (#17123)
    
    1. Show cost in optimized plan
    2. show plan time schedule time and so on in profile
---
 .../org/apache/doris/analysis/ShowQueryProfileStmt.java  |  7 +++++++
 .../org/apache/doris/common/util/ProfileManager.java     | 16 ++++++++++++++++
 .../doris/httpv2/controller/QueryProfileController.java  |  4 +++-
 .../java/org/apache/doris/nereids/NereidsPlanner.java    | 14 ++++++++++----
 .../main/java/org/apache/doris/nereids/memo/Memo.java    |  4 ++--
 .../java/org/apache/doris/nereids/memo/RankTest.java     |  2 +-
 6 files changed, 39 insertions(+), 8 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowQueryProfileStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowQueryProfileStmt.java
index b36cd30159..e8f8b6df65 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowQueryProfileStmt.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowQueryProfileStmt.java
@@ -44,6 +44,13 @@ public class ShowQueryProfileStmt extends ShowStmt {
                     .addColumn(new Column("EndTime", 
ScalarType.createVarchar(128)))
                     .addColumn(new Column("TotalTime", 
ScalarType.createVarchar(128)))
                     .addColumn(new Column("QueryState", 
ScalarType.createVarchar(128)))
+                    .addColumn(new Column("TraceId", 
ScalarType.createVarchar(128)))
+                    .addColumn(new Column("AnalysisTime", 
ScalarType.createVarchar(128)))
+                    .addColumn(new Column("PlanTime", 
ScalarType.createVarchar(128)))
+                    .addColumn(new Column("ScheduleTime", 
ScalarType.createVarchar(128)))
+                    .addColumn(new Column("FetchResultTime", 
ScalarType.createVarchar(128)))
+                    .addColumn(new Column("WriteResultTime", 
ScalarType.createVarchar(128)))
+                    .addColumn(new Column("WaitAndFetchResultTime", 
ScalarType.createVarchar(128)))
                     .build();
 
     public static final ShowResultSetMetaData META_DATA_FRAGMENTS =
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/common/util/ProfileManager.java 
b/fe/fe-core/src/main/java/org/apache/doris/common/util/ProfileManager.java
index 8d0c825e88..0d4c6d49b8 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/util/ProfileManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/ProfileManager.java
@@ -79,6 +79,12 @@ public class ProfileManager {
     public static final String PARALLEL_FRAGMENT_EXEC_INSTANCE = "Parallel 
Fragment Exec Instance Num";
 
     public static final String TRACE_ID = "Trace ID";
+    public static final String ANALYSIS_TIME = "Analysis Time";
+    public static final String FETCH_RESULT_TIME = "Fetch Result Time";
+    public static final String PLAN_TIME = "Plan Time";
+    public static final String SCHEDULE_TIME = "Schedule Time";
+    public static final String WRITE_RESULT_TIME = "Write Result Time";
+    public static final String WAIT_FETCH_RESULT_TIME = "Wait and Fetch Result 
Time";
 
     public enum ProfileType {
         QUERY,
@@ -88,6 +94,9 @@ public class ProfileManager {
     public static final List<String> PROFILE_HEADERS = 
Collections.unmodifiableList(
             Arrays.asList(JOB_ID, QUERY_ID, USER, DEFAULT_DB, SQL_STATEMENT, 
QUERY_TYPE,
                     START_TIME, END_TIME, TOTAL_TIME, QUERY_STATE, TRACE_ID));
+    public static final List<String> EXECUTION_HEADERS = 
Collections.unmodifiableList(
+            Arrays.asList(ANALYSIS_TIME, PLAN_TIME, SCHEDULE_TIME, 
FETCH_RESULT_TIME,
+              WRITE_RESULT_TIME, WAIT_FETCH_RESULT_TIME));
 
     private class ProfileElement {
         public ProfileElement(RuntimeProfile profile) {
@@ -146,6 +155,10 @@ public class ProfileManager {
         for (String header : PROFILE_HEADERS) {
             element.infoStrings.put(header, 
summaryProfile.getInfoString(header));
         }
+        RuntimeProfile executionProfile = 
summaryProfile.getChildList().get(0).first;
+        for (String header : EXECUTION_HEADERS) {
+            element.infoStrings.put(header, 
executionProfile.getInfoString(header));
+        }
 
         MultiProfileTreeBuilder builder = new MultiProfileTreeBuilder(profile);
         try {
@@ -215,6 +228,9 @@ public class ProfileManager {
                 for (String str : PROFILE_HEADERS) {
                     row.add(infoStrings.get(str));
                 }
+                for (String str : EXECUTION_HEADERS) {
+                    row.add(infoStrings.get(str));
+                }
                 result.add(row);
             }
         } finally {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/httpv2/controller/QueryProfileController.java
 
b/fe/fe-core/src/main/java/org/apache/doris/httpv2/controller/QueryProfileController.java
index 53744f4fc8..a75b1c7071 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/httpv2/controller/QueryProfileController.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/httpv2/controller/QueryProfileController.java
@@ -69,7 +69,9 @@ public class QueryProfileController extends BaseController {
 
     private void addFinishedQueryInfo(Map<String, Object> result) {
         List<List<String>> finishedQueries = 
ProfileManager.getInstance().getAllQueries();
-        List<String> columnHeaders = 
Lists.newLinkedList(ProfileManager.PROFILE_HEADERS);
+        List<String> columnHeaders = Lists.newLinkedList();
+        columnHeaders.addAll(ProfileManager.PROFILE_HEADERS);
+        columnHeaders.addAll(ProfileManager.EXECUTION_HEADERS);
         int jobIdIndex = -1;
         int queryIdIndex = -1;
         int queryTypeIndex = -1;
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 d19c176228..8456f6c2db 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
@@ -21,6 +21,7 @@ import org.apache.doris.analysis.DescriptorTable;
 import org.apache.doris.analysis.ExplainOptions;
 import org.apache.doris.analysis.StatementBase;
 import org.apache.doris.common.NereidsException;
+import org.apache.doris.common.Pair;
 import org.apache.doris.nereids.CascadesContext.Lock;
 import org.apache.doris.nereids.exceptions.AnalysisException;
 import org.apache.doris.nereids.glue.LogicalPlanAdapter;
@@ -76,6 +77,8 @@ public class NereidsPlanner extends Planner {
     private Plan analyzedPlan;
     private Plan rewrittenPlan;
     private Plan optimizedPlan;
+    // The cost of optimized plan
+    private double cost = 0;
 
     public NereidsPlanner(StatementContext statementContext) {
         this.statementContext = statementContext;
@@ -261,12 +264,16 @@ public class NereidsPlanner extends Planner {
 
     private PhysicalPlan chooseNthPlan(Group rootGroup, PhysicalProperties 
physicalProperties, int nthPlan) {
         if (nthPlan <= 1) {
+            cost = rootGroup.getLowestCostPlan(physicalProperties).orElseThrow(
+                    () -> new AnalysisException("lowestCostPlans with 
physicalProperties("
+                            + physicalProperties + ") doesn't exist in root 
group")).first;
             return chooseBestPlan(rootGroup, physicalProperties);
         }
         Memo memo = cascadesContext.getMemo();
 
-        long id = memo.rank(nthPlan);
-        return memo.unrank(id);
+        Pair<Long, Double> idCost = memo.rank(nthPlan);
+        cost = idCost.second;
+        return memo.unrank(idCost.first);
     }
 
     private PhysicalPlan chooseBestPlan(Group rootGroup, PhysicalProperties 
physicalProperties)
@@ -276,7 +283,6 @@ public class NereidsPlanner extends Planner {
                     () -> new AnalysisException("lowestCostPlans with 
physicalProperties("
                             + physicalProperties + ") doesn't exist in root 
group")).second;
             List<PhysicalProperties> inputPropertiesList = 
groupExpression.getInputPropertiesList(physicalProperties);
-
             List<Plan> planChildren = Lists.newArrayList();
             for (int i = 0; i < groupExpression.arity(); i++) {
                 planChildren.add(chooseBestPlan(groupExpression.child(i), 
inputPropertiesList.get(i)));
@@ -310,7 +316,7 @@ public class NereidsPlanner extends Planner {
             case REWRITTEN_PLAN:
                 return rewrittenPlan.treeString();
             case OPTIMIZED_PLAN:
-                return optimizedPlan.treeString();
+                return "cost = " + cost + "\n" + optimizedPlan.treeString();
             case ALL_PLAN:
                 return "========== PARSED PLAN ==========\n"
                         + parsedPlan.treeString() + "\n\n"
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 304a2da025..b27d9a1f59 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
@@ -719,7 +719,7 @@ public class Memo {
      *
      * In unrank() function, we will extract the actual physical function 
according the unique ID
      */
-    public long rank(long n) {
+    public Pair<Long, Double> rank(long n) {
         double threshold = 0.000000001;
         Preconditions.checkArgument(n > 0, "the n %d must be greater than 0 in 
nthPlan", n);
         List<Pair<Long, Double>> plans = rankGroup(root, 
PhysicalProperties.GATHER);
@@ -737,7 +737,7 @@ public class Memo {
                 pq.poll();
             }
         }
-        return pq.peek().first;
+        return pq.peek();
     }
 
     private List<Pair<Long, Double>> rankGroup(Group group, PhysicalProperties 
prop) {
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/memo/RankTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/memo/RankTest.java
index 0eb91caf3a..3deb2a9638 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/memo/RankTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/memo/RankTest.java
@@ -55,7 +55,7 @@ public class RankTest extends TPCHTestBase {
                     .optimize()
                     .getCascadesContext()
                     .getMemo();
-            PhysicalPlan plan1 = memo.unrank(memo.rank(1));
+            PhysicalPlan plan1 = memo.unrank(memo.rank(1).first);
             PhysicalPlan plan2 = PlanChecker.from(connectContext)
                     .analyze(field.get(null).toString())
                     .rewrite()


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to