This is an automated email from the ASF dual-hosted git repository. caogaofei pushed a commit to branch beyyes/perfect_explain_analyze in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit be8088cbc4f2d7081daa2356e7287a10af8ebcbb Author: Beyyes <[email protected]> AuthorDate: Sun Jul 14 20:47:54 2024 +0800 perfect impl of ExplainAnalyzeOperator --- .../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; } }
