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

jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new ded0abb7bb1 Perfect impl of dispatch cost in ExplainAnalyze
ded0abb7bb1 is described below

commit ded0abb7bb156bbbe9d04b170c4556c74c2e80a0
Author: Beyyes <[email protected]>
AuthorDate: Mon Jul 15 09:34:31 2024 +0800

    Perfect impl of dispatch cost in ExplainAnalyze
---
 .../apache/iotdb/db/queryengine/common/MPPQueryContext.java   | 11 +++++++----
 .../execution/operator/ExplainAnalyzeOperator.java            |  7 ++++++-
 .../plan/scheduler/FragmentInstanceDispatcherImpl.java        |  7 ++++---
 .../statistics/FragmentInstanceStatisticsDrawer.java          |  7 ++++---
 .../iotdb/db/queryengine/statistics/QueryPlanStatistics.java  | 10 +++++-----
 5 files changed, 26 insertions(+), 16 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
index a117d9f421d..7eebccdd675 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
@@ -258,12 +258,15 @@ public class MPPQueryContext {
     return queryPlanStatistics.getLogicalOptimizationCost();
   }
 
-  public void setDispatchStartTime(long time) {
-    this.queryPlanStatistics.setDispatchStartTime(time);
+  public void recordDispatchCost(long dispatchCost) {
+    if (queryPlanStatistics == null) {
+      queryPlanStatistics = new QueryPlanStatistics();
+    }
+    queryPlanStatistics.recordDispatchCost(dispatchCost);
   }
 
-  public long getDispatchStartTime() {
-    return queryPlanStatistics.getDispatchStartTime();
+  public long getDispatchCost() {
+    return queryPlanStatistics.getDispatchCost();
   }
 
   public void setAnalyzeCost(long analyzeCost) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/ExplainAnalyzeOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/ExplainAnalyzeOperator.java
index 69e9b5f6d29..13adf9b1d65 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/ExplainAnalyzeOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/ExplainAnalyzeOperator.java
@@ -26,6 +26,7 @@ import 
org.apache.iotdb.commons.concurrent.threadpool.ScheduledExecutorUtil;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.db.exception.mpp.FragmentInstanceFetchException;
 import org.apache.iotdb.db.queryengine.common.FragmentInstanceId;
+import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.execution.MemoryEstimationHelper;
 import 
org.apache.iotdb.db.queryengine.execution.operator.process.ProcessOperator;
 import org.apache.iotdb.db.queryengine.plan.Coordinator;
@@ -73,6 +74,7 @@ public class ExplainAnalyzeOperator implements 
ProcessOperator {
 
   private final ScheduledFuture<?> logRecordTask;
   private final IClientManager<TEndPoint, SyncDataNodeInternalServiceClient> 
clientManager;
+  private final MPPQueryContext mppQueryContext;
 
   public ExplainAnalyzeOperator(
       OperatorContext operatorContext,
@@ -89,7 +91,8 @@ public class ExplainAnalyzeOperator implements 
ProcessOperator {
 
     QueryExecution queryExecution = (QueryExecution) 
coordinator.getQueryExecution(queryId);
     this.instances = queryExecution.getDistributedPlan().getInstances();
-    
fragmentInstanceStatisticsDrawer.renderPlanStatistics(queryExecution.getContext());
+    mppQueryContext = queryExecution.getContext();
+    fragmentInstanceStatisticsDrawer.renderPlanStatistics(mppQueryContext);
 
     // The time interval guarantees the result of EXPLAIN ANALYZE will be 
printed at least three
     // times.
@@ -116,6 +119,8 @@ public class ExplainAnalyzeOperator implements 
ProcessOperator {
       return null;
     }
 
+    fragmentInstanceStatisticsDrawer.renderDispatchCost(mppQueryContext);
+
     // fetch statics from all fragment instances
     TsBlock result = buildResult();
     outputResult = true;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/FragmentInstanceDispatcherImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/FragmentInstanceDispatcherImpl.java
index 986eb8c9b15..febd9334e8a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/FragmentInstanceDispatcherImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/FragmentInstanceDispatcherImpl.java
@@ -125,7 +125,6 @@ public class FragmentInstanceDispatcherImpl implements 
IFragInstanceDispatcher {
   //  topological dispatch according to dependency relations between 
FragmentInstances
   private Future<FragInstanceDispatchResult> 
dispatchRead(List<FragmentInstance> instances) {
     long startTime = System.nanoTime();
-    queryContext.setDispatchStartTime(startTime);
     for (FragmentInstance instance : instances) {
       try (SetThreadName threadName = new 
SetThreadName(instance.getId().getFullId())) {
         dispatchOneInstance(instance);
@@ -147,8 +146,10 @@ public class FragmentInstanceDispatcherImpl implements 
IFragInstanceDispatcher {
           // TypeProvider is not used in EXPLAIN ANALYZE, so we can clear it
           instance.getFragment().clearTypeProvider();
         }
-        QUERY_EXECUTION_METRIC_SET.recordExecutionCost(
-            DISPATCH_READ, System.nanoTime() - startTime);
+
+        long dispatchReadTime = System.nanoTime() - startTime;
+        QUERY_EXECUTION_METRIC_SET.recordExecutionCost(DISPATCH_READ, 
dispatchReadTime);
+        queryContext.recordDispatchCost(dispatchReadTime);
       }
     }
     return immediateFuture(new FragInstanceDispatchResult(true));
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/FragmentInstanceStatisticsDrawer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/FragmentInstanceStatisticsDrawer.java
index 71638a9c83f..bb40301506a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/FragmentInstanceStatisticsDrawer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/FragmentInstanceStatisticsDrawer.java
@@ -69,12 +69,13 @@ public class FragmentInstanceStatisticsDrawer {
         String.format(
             "Distribution Plan Cost: %.3f ms",
             context.getDistributionPlanCost() * NS_TO_MS_FACTOR));
+  }
+
+  public void renderDispatchCost(MPPQueryContext context) {
     addLine(
         planHeader,
         0,
-        String.format(
-            "Single Dispatch Cost: %.3f ms",
-            (System.nanoTime() - context.getDispatchStartTime()) * 
NS_TO_MS_FACTOR));
+        String.format("Dispatch Cost: %.3f ms", context.getDispatchCost() * 
NS_TO_MS_FACTOR));
   }
 
   public List<StatisticLine> renderFragmentInstances(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/QueryPlanStatistics.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/QueryPlanStatistics.java
index ad4d549e697..edb13217db2 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/QueryPlanStatistics.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/QueryPlanStatistics.java
@@ -26,7 +26,7 @@ public class QueryPlanStatistics {
   private long logicalPlanCost;
   private long logicalOptimizationCost;
   private long distributionPlanCost;
-  private long dispatchStartTime = 0;
+  private long dispatchCost = 0;
 
   public void setAnalyzeCost(long analyzeCost) {
     this.analyzeCost = analyzeCost;
@@ -76,11 +76,11 @@ public class QueryPlanStatistics {
     return logicalOptimizationCost;
   }
 
-  public void setDispatchStartTime(long dispatchStartTime) {
-    this.dispatchStartTime = dispatchStartTime;
+  public void recordDispatchCost(long dispatchCost) {
+    this.dispatchCost += dispatchCost;
   }
 
-  public long getDispatchStartTime() {
-    return dispatchStartTime;
+  public long getDispatchCost() {
+    return dispatchCost;
   }
 }

Reply via email to