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;
}
}