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 2c4acfc1af8 Add query metrics AGGREGATION_FROM_RAW_DATA and 
AGGREGATION_FROM_STATISTICS for table model
2c4acfc1af8 is described below

commit 2c4acfc1af892a27e414f3802e8a32c3f1913f03
Author: Beyyes <[email protected]>
AuthorDate: Tue Feb 18 10:49:09 2025 +0800

    Add query metrics AGGREGATION_FROM_RAW_DATA and AGGREGATION_FROM_STATISTICS 
for table model
---
 .../relational/aggregation/TableAggregator.java    | 49 +++++++++++-----
 .../queryengine/metric/QueryPlanCostMetricSet.java | 68 +++++++++++++---------
 .../queryengine/plan/analyze/AnalyzeVisitor.java   | 10 ++--
 .../db/queryengine/plan/analyze/Analyzer.java      |  3 +-
 .../queryengine/plan/analyze/TemplatedAnalyze.java |  3 +-
 .../queryengine/plan/execution/QueryExecution.java | 14 +----
 .../db/queryengine/plan/planner/IPlanner.java      |  3 +-
 .../queryengine/plan/planner/LogicalPlanner.java   |  6 +-
 .../queryengine/plan/planner/TreeModelPlanner.java | 20 ++++++-
 .../plan/relational/analyzer/Analyzer.java         |  3 +-
 .../relational/planner/TableLogicalPlanner.java    |  5 +-
 .../plan/relational/planner/TableModelPlanner.java | 32 +++++++---
 .../distribute/TableDistributedPlanner.java        | 11 +---
 .../optimizations/PushPredicateIntoTableScan.java  |  6 +-
 14 files changed, 132 insertions(+), 101 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/TableAggregator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/TableAggregator.java
index ea4095e418e..fbbc7083127 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/TableAggregator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/aggregation/TableAggregator.java
@@ -34,7 +34,10 @@ import java.util.OptionalInt;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.Objects.requireNonNull;
+import static 
org.apache.iotdb.db.queryengine.execution.aggregation.TreeAggregator.QUERY_EXECUTION_METRICS;
 import static 
org.apache.iotdb.db.queryengine.execution.operator.source.relational.TableScanOperator.TIME_COLUMN_TEMPLATE;
+import static 
org.apache.iotdb.db.queryengine.metric.QueryExecutionMetricSet.AGGREGATION_FROM_RAW_DATA;
+import static 
org.apache.iotdb.db.queryengine.metric.QueryExecutionMetricSet.AGGREGATION_FROM_STATISTICS;
 
 public class TableAggregator {
   private final TableAccumulator accumulator;
@@ -64,25 +67,33 @@ public class TableAggregator {
   }
 
   public void processBlock(TsBlock block) {
-    Column[] arguments = block.getColumns(inputChannels);
+    long startTime = System.nanoTime();
+    try {
+      Column[] arguments = block.getColumns(inputChannels);
+
+      // process count(*)
+      if (arguments.length == 0) {
+        arguments =
+            new Column[] {
+              new RunLengthEncodedColumn(TIME_COLUMN_TEMPLATE, 
block.getPositionCount())
+            };
+      }
 
-    // process count(*)
-    if (arguments.length == 0) {
-      arguments =
-          new Column[] {new RunLengthEncodedColumn(TIME_COLUMN_TEMPLATE, 
block.getPositionCount())};
-    }
+      if (step.isInputRaw()) {
+        // Use select-all AggregationMask here because filter of Agg-Function 
is not supported now
+        AggregationMask mask = 
AggregationMask.createSelectAll(block.getPositionCount());
 
-    if (step.isInputRaw()) {
-      // Use select-all AggregationMask here because filter of Agg-Function is 
not supported now
-      AggregationMask mask = 
AggregationMask.createSelectAll(block.getPositionCount());
+        if (maskChannel.isPresent()) {
+          mask.applyMaskBlock(block.getColumn(maskChannel.getAsInt()));
+        }
 
-      if (maskChannel.isPresent()) {
-        mask.applyMaskBlock(block.getColumn(maskChannel.getAsInt()));
+        accumulator.addInput(arguments, mask);
+      } else {
+        accumulator.addIntermediate(arguments[0]);
       }
-
-      accumulator.addInput(arguments, mask);
-    } else {
-      accumulator.addIntermediate(arguments[0]);
+    } finally {
+      QUERY_EXECUTION_METRICS.recordExecutionCost(
+          AGGREGATION_FROM_RAW_DATA, System.nanoTime() - startTime);
     }
   }
 
@@ -95,7 +106,13 @@ public class TableAggregator {
   }
 
   public void processStatistics(Statistics[] statistics) {
-    accumulator.addStatistics(statistics);
+    long startTime = System.nanoTime();
+    try {
+      accumulator.addStatistics(statistics);
+    } finally {
+      QUERY_EXECUTION_METRICS.recordExecutionCost(
+          AGGREGATION_FROM_STATISTICS, System.nanoTime() - startTime);
+    }
   }
 
   public boolean hasFinalResult() {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/metric/QueryPlanCostMetricSet.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/metric/QueryPlanCostMetricSet.java
index 0b0721fe44b..fde32995b23 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/metric/QueryPlanCostMetricSet.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/metric/QueryPlanCostMetricSet.java
@@ -49,6 +49,7 @@ public class QueryPlanCostMetricSet implements IMetricSet {
 
   private Timer treeAnalyzerTimer = DoNothingMetricManager.DO_NOTHING_TIMER;
   private Timer treeLogicalPlannerTimer = 
DoNothingMetricManager.DO_NOTHING_TIMER;
+  private Timer treeLogicalPlanOptimizerTimer = 
DoNothingMetricManager.DO_NOTHING_TIMER;
   private Timer treeDistributionPlannerTimer = 
DoNothingMetricManager.DO_NOTHING_TIMER;
   private Timer treePartitionFetcherTimer = 
DoNothingMetricManager.DO_NOTHING_TIMER;
   private Timer treeSchemaFetcherTimer = 
DoNothingMetricManager.DO_NOTHING_TIMER;
@@ -60,48 +61,53 @@ public class QueryPlanCostMetricSet implements IMetricSet {
   private Timer tablePartitionFetcherTimer = 
DoNothingMetricManager.DO_NOTHING_TIMER;
   private Timer tableSchemaFetcherTimer = 
DoNothingMetricManager.DO_NOTHING_TIMER;
 
-  public void recordPlanCost(String type, String stage, long costTimeInNanos) {
+  public void recordTreePlanCost(String stage, long costTimeInNanos) {
     switch (stage) {
       case ANALYZER:
-        if (TREE_TYPE.equals(type)) {
-          treeAnalyzerTimer.updateNanos(costTimeInNanos);
-        } else {
-          tableAnalyzerTimer.updateNanos(costTimeInNanos);
-        }
+        treeAnalyzerTimer.updateNanos(costTimeInNanos);
         break;
       case LOGICAL_PLANNER:
-        if (TREE_TYPE.equals(type)) {
-          treeLogicalPlannerTimer.updateNanos(costTimeInNanos);
-        } else {
-          tableLogicalPlannerTimer.updateNanos(costTimeInNanos);
-        }
+        treeLogicalPlannerTimer.updateNanos(costTimeInNanos);
+        break;
+      case LOGICAL_PLAN_OPTIMIZE:
+        treeLogicalPlanOptimizerTimer.updateNanos(costTimeInNanos);
+        break;
+      case DISTRIBUTION_PLANNER:
+        treeDistributionPlannerTimer.updateNanos(costTimeInNanos);
+        break;
+      case PARTITION_FETCHER:
+        treePartitionFetcherTimer.updateNanos(costTimeInNanos);
+        break;
+      case SCHEMA_FETCHER:
+        treeSchemaFetcherTimer.updateNanos(costTimeInNanos);
+        break;
+      default:
+        throw new UnsupportedOperationException("Unsupported stage in tree 
model: " + stage);
+    }
+  }
+
+  public void recordTablePlanCost(String stage, long costTimeInNanos) {
+    switch (stage) {
+      case ANALYZER:
+        tableAnalyzerTimer.updateNanos(costTimeInNanos);
+        break;
+      case LOGICAL_PLANNER:
+        tableLogicalPlannerTimer.updateNanos(costTimeInNanos);
         break;
       case LOGICAL_PLAN_OPTIMIZE:
         tableLogicalPlanOptimizerTimer.updateNanos(costTimeInNanos);
         break;
       case DISTRIBUTION_PLANNER:
-        if (TREE_TYPE.equals(type)) {
-          treeDistributionPlannerTimer.updateNanos(costTimeInNanos);
-        } else {
-          tableDistributionPlannerTimer.updateNanos(costTimeInNanos);
-        }
+        tableDistributionPlannerTimer.updateNanos(costTimeInNanos);
         break;
       case PARTITION_FETCHER:
-        if (TREE_TYPE.equals(type)) {
-          treePartitionFetcherTimer.updateNanos(costTimeInNanos);
-        } else {
-          tablePartitionFetcherTimer.updateNanos(costTimeInNanos);
-        }
+        tablePartitionFetcherTimer.updateNanos(costTimeInNanos);
         break;
       case SCHEMA_FETCHER:
-        if (TREE_TYPE.equals(type)) {
-          treeSchemaFetcherTimer.updateNanos(costTimeInNanos);
-        } else {
-          tableSchemaFetcherTimer.updateNanos(costTimeInNanos);
-        }
+        tableSchemaFetcherTimer.updateNanos(costTimeInNanos);
         break;
       default:
-        throw new UnsupportedOperationException("Unsupported stage: " + stage);
+        throw new UnsupportedOperationException("Unsupported stage in table 
model: " + stage);
     }
   }
 
@@ -123,6 +129,14 @@ public class QueryPlanCostMetricSet implements IMetricSet {
             TREE_TYPE,
             Tag.STAGE.toString(),
             LOGICAL_PLANNER);
+    treeLogicalPlanOptimizerTimer =
+        metricService.getOrCreateTimer(
+            Metric.QUERY_PLAN_COST.toString(),
+            MetricLevel.IMPORTANT,
+            Tag.TYPE.toString(),
+            TREE_TYPE,
+            Tag.STAGE.toString(),
+            LOGICAL_PLAN_OPTIMIZE);
     treeDistributionPlannerTimer =
         metricService.getOrCreateTimer(
             Metric.QUERY_PLAN_COST.toString(),
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
index 27111794cc9..ad8ef1f2afc 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
@@ -197,7 +197,6 @@ import static 
org.apache.iotdb.commons.schema.column.ColumnHeaderConstant.DEVICE
 import static 
org.apache.iotdb.commons.schema.column.ColumnHeaderConstant.ENDTIME;
 import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.PARTITION_FETCHER;
 import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.SCHEMA_FETCHER;
-import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.TREE_TYPE;
 import static 
org.apache.iotdb.db.queryengine.plan.analyze.AnalyzeUtils.removeLogicalView;
 import static 
org.apache.iotdb.db.queryengine.plan.analyze.AnalyzeUtils.validateSchema;
 import static 
org.apache.iotdb.db.queryengine.plan.analyze.ExpressionAnalyzer.bindSchemaForExpression;
@@ -534,8 +533,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       logger.debug("[EndFetchSchema]");
       long schemaFetchCost = System.nanoTime() - startTime;
       context.setFetchSchemaCost(schemaFetchCost);
-      QueryPlanCostMetricSet.getInstance()
-          .recordPlanCost(TREE_TYPE, SCHEMA_FETCHER, schemaFetchCost);
+      QueryPlanCostMetricSet.getInstance().recordTreePlanCost(SCHEMA_FETCHER, 
schemaFetchCost);
     }
 
     analysis.setSchemaTree(schemaTree);
@@ -2224,7 +2222,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     } finally {
       long partitionFetchCost = System.nanoTime() - startTime;
       QueryPlanCostMetricSet.getInstance()
-          .recordPlanCost(TREE_TYPE, PARTITION_FETCHER, partitionFetchCost);
+          .recordTreePlanCost(PARTITION_FETCHER, partitionFetchCost);
       context.setFetchPartitionCost(partitionFetchCost);
     }
   }
@@ -2387,7 +2385,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     long startTime = System.nanoTime();
     ISchemaTree targetSchemaTree = schemaFetcher.fetchSchema(targetPathTree, 
true, context);
     QueryPlanCostMetricSet.getInstance()
-        .recordPlanCost(TREE_TYPE, SCHEMA_FETCHER, System.nanoTime() - 
startTime);
+        .recordTreePlanCost(SCHEMA_FETCHER, System.nanoTime() - startTime);
     deviceViewIntoPathDescriptor.bindType(targetSchemaTree);
 
     analysis.setDeviceViewIntoPathDescriptor(deviceViewIntoPathDescriptor);
@@ -2465,7 +2463,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     ISchemaTree targetSchemaTree = schemaFetcher.fetchSchema(targetPathTree, 
true, context);
     updateSchemaTreeByViews(analysis, targetSchemaTree, context);
     QueryPlanCostMetricSet.getInstance()
-        .recordPlanCost(TREE_TYPE, SCHEMA_FETCHER, System.nanoTime() - 
startTime);
+        .recordTreePlanCost(SCHEMA_FETCHER, System.nanoTime() - startTime);
     intoPathDescriptor.bindType(targetSchemaTree);
 
     analysis.setIntoPathDescriptor(intoPathDescriptor);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analyzer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analyzer.java
index 7b092040049..43cf67a283c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analyzer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/Analyzer.java
@@ -26,7 +26,6 @@ import 
org.apache.iotdb.db.queryengine.plan.analyze.schema.ISchemaFetcher;
 import org.apache.iotdb.db.queryengine.plan.statement.Statement;
 
 import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.ANALYZER;
-import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.TREE_TYPE;
 
 /** Analyze the statement and generate Analysis. */
 public class Analyzer {
@@ -57,7 +56,7 @@ public class Analyzer {
               - startTime
               - context.getFetchSchemaCost()
               - context.getFetchPartitionCost();
-      QueryPlanCostMetricSet.getInstance().recordPlanCost(TREE_TYPE, ANALYZER, 
analyzeCost);
+      QueryPlanCostMetricSet.getInstance().recordTreePlanCost(ANALYZER, 
analyzeCost);
       context.setAnalyzeCost(analyzeCost);
     }
     return analysis;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
index ea70fcb0e3a..4a4fc073410 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TemplatedAnalyze.java
@@ -58,7 +58,6 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.PARTITION_FETCHER;
-import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.TREE_TYPE;
 import static 
org.apache.iotdb.db.queryengine.plan.analyze.AnalyzeVisitor.CONFIG;
 import static 
org.apache.iotdb.db.queryengine.plan.analyze.AnalyzeVisitor.DEVICE_EXPRESSION;
 import static 
org.apache.iotdb.db.queryengine.plan.analyze.AnalyzeVisitor.END_TIME_EXPRESSION;
@@ -418,7 +417,7 @@ public class TemplatedAnalyze {
       }
     } finally {
       QueryPlanCostMetricSet.getInstance()
-          .recordPlanCost(TREE_TYPE, PARTITION_FETCHER, System.nanoTime() - 
startTime);
+          .recordTreePlanCost(PARTITION_FETCHER, System.nanoTime() - 
startTime);
     }
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
index 84a757893bc..8ffc084da69 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
@@ -72,8 +72,6 @@ import static 
com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Throwables.throwIfUnchecked;
 import static 
org.apache.iotdb.db.queryengine.common.DataNodeEndPoints.isSameNode;
 import static 
org.apache.iotdb.db.queryengine.metric.QueryExecutionMetricSet.WAIT_FOR_RESULT;
-import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.DISTRIBUTION_PLANNER;
-import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.TREE_TYPE;
 import static org.apache.iotdb.db.utils.ErrorHandlingUtils.getRootCause;
 
 /**
@@ -288,15 +286,7 @@ public class QueryExecution implements IQueryExecution {
 
   // Generate the distributed plan and split it into fragments
   public void doDistributedPlan() {
-    final long startTime = System.nanoTime();
-    this.distributedPlan = planner.doDistributionPlan(analysis, logicalPlan);
-
-    if (analysis.isQuery()) {
-      final long distributionPlanCost = System.nanoTime() - startTime;
-      context.setDistributionPlanCost(distributionPlanCost);
-      QUERY_PLAN_COST_METRIC_SET.recordPlanCost(
-          TREE_TYPE, DISTRIBUTION_PLANNER, distributionPlanCost);
-    }
+    this.distributedPlan = planner.doDistributionPlan(analysis, logicalPlan, 
context);
 
     // if is this Statement is ShowQueryStatement, set its instances to the 
highest priority, so
     // that the sub-tasks of the ShowQueries instances could be executed first.
@@ -304,7 +294,7 @@ public class QueryExecution implements IQueryExecution {
       distributedPlan.getInstances().forEach(instance -> 
instance.setHighestPriority(true));
     }
 
-    if (isQuery() && LOGGER.isDebugEnabled()) {
+    if (LOGGER.isDebugEnabled() && isQuery()) {
       LOGGER.debug(
           "distribution plan done. Fragment instance count is {}, details is: 
\n {}",
           distributedPlan.getInstances().size(),
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/IPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/IPlanner.java
index b9b239b5e26..501aa1e09d4 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/IPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/IPlanner.java
@@ -36,7 +36,8 @@ public interface IPlanner {
 
   LogicalQueryPlan doLogicalPlan(IAnalysis analysis, MPPQueryContext context);
 
-  DistributedQueryPlan doDistributionPlan(IAnalysis analysis, LogicalQueryPlan 
logicalPlan);
+  DistributedQueryPlan doDistributionPlan(
+      IAnalysis analysis, LogicalQueryPlan logicalPlan, MPPQueryContext 
context);
 
   IScheduler doSchedule(
       IAnalysis analysis,
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanner.java
index e649880bfd7..c2a757ba105 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanner.java
@@ -33,7 +33,6 @@ import java.util.List;
 
 import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.LOGICAL_PLANNER;
 import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.LOGICAL_PLAN_OPTIMIZE;
-import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.TREE_TYPE;
 
 /** Generate a logical plan for the statement. */
 public class LogicalPlanner {
@@ -57,8 +56,7 @@ public class LogicalPlanner {
       long planFinishTime = System.nanoTime();
       long logicalPlanCost = planFinishTime - startTime;
       context.setLogicalPlanCost(logicalPlanCost);
-      QueryPlanCostMetricSet.getInstance()
-          .recordPlanCost(TREE_TYPE, LOGICAL_PLANNER, logicalPlanCost);
+      QueryPlanCostMetricSet.getInstance().recordTreePlanCost(LOGICAL_PLANNER, 
logicalPlanCost);
 
       for (PlanOptimizer optimizer : optimizers) {
         rootNode = optimizer.optimize(rootNode, analysis, context);
@@ -66,7 +64,7 @@ public class LogicalPlanner {
       long logicalOptimizationCost = System.nanoTime() - planFinishTime;
       context.setLogicalOptimizationCost(logicalOptimizationCost);
       QueryPlanCostMetricSet.getInstance()
-          .recordPlanCost(TREE_TYPE, LOGICAL_PLAN_OPTIMIZE, 
logicalOptimizationCost);
+          .recordTreePlanCost(LOGICAL_PLAN_OPTIMIZE, logicalOptimizationCost);
     }
 
     return new LogicalQueryPlan(context, rootNode);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TreeModelPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TreeModelPlanner.java
index a4726550ad4..88bdeb87a38 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TreeModelPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TreeModelPlanner.java
@@ -26,6 +26,7 @@ import 
org.apache.iotdb.commons.client.async.AsyncDataNodeInternalServiceClient;
 import org.apache.iotdb.commons.client.sync.SyncDataNodeInternalServiceClient;
 import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.execution.QueryStateMachine;
+import org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet;
 import org.apache.iotdb.db.queryengine.plan.analyze.Analysis;
 import org.apache.iotdb.db.queryengine.plan.analyze.Analyzer;
 import org.apache.iotdb.db.queryengine.plan.analyze.IAnalysis;
@@ -51,6 +52,8 @@ import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ScheduledExecutorService;
 
+import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.DISTRIBUTION_PLANNER;
+
 public class TreeModelPlanner implements IPlanner {
 
   private final Statement statement;
@@ -101,9 +104,20 @@ public class TreeModelPlanner implements IPlanner {
   }
 
   @Override
-  public DistributedQueryPlan doDistributionPlan(IAnalysis analysis, 
LogicalQueryPlan logicalPlan) {
-    DistributionPlanner planner = new DistributionPlanner((Analysis) analysis, 
logicalPlan);
-    return planner.planFragments();
+  public DistributedQueryPlan doDistributionPlan(
+      IAnalysis analysis, LogicalQueryPlan logicalPlan, MPPQueryContext 
context) {
+    long startTime = System.nanoTime();
+    try {
+      DistributionPlanner planner = new DistributionPlanner((Analysis) 
analysis, logicalPlan);
+      return planner.planFragments();
+    } finally {
+      if (analysis.isQuery()) {
+        long distributionPlanCost = System.nanoTime() - startTime;
+        context.setDistributionPlanCost(distributionPlanCost);
+        QueryPlanCostMetricSet.getInstance()
+            .recordTreePlanCost(DISTRIBUTION_PLANNER, distributionPlanCost);
+      }
+    }
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analyzer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analyzer.java
index 544c8c4643e..3f7c5322c8e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analyzer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/Analyzer.java
@@ -36,7 +36,6 @@ import java.util.Map;
 
 import static java.util.Objects.requireNonNull;
 import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.ANALYZER;
-import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.TABLE_TYPE;
 
 public class Analyzer {
 
@@ -106,7 +105,7 @@ public class Analyzer {
     analyzer.analyze(rewrittenStatement);
     if (analysis.isQuery()) {
       long analyzeCost = System.nanoTime() - startTime;
-      QueryPlanCostMetricSet.getInstance().recordPlanCost(TABLE_TYPE, 
ANALYZER, analyzeCost);
+      QueryPlanCostMetricSet.getInstance().recordTreePlanCost(ANALYZER, 
analyzeCost);
       context.setAnalyzeCost(analyzeCost);
     }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableLogicalPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableLogicalPlanner.java
index f5a88825119..02ec34740a9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableLogicalPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableLogicalPlanner.java
@@ -84,7 +84,6 @@ import java.util.Optional;
 import static java.util.Objects.requireNonNull;
 import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.LOGICAL_PLANNER;
 import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.LOGICAL_PLAN_OPTIMIZE;
-import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.TABLE_TYPE;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.CountDevice.COUNT_DEVICE_HEADER_STRING;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowDevice.getDeviceColumnHeaderList;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager.getTSDataType;
@@ -137,7 +136,7 @@ public class TableLogicalPlanner {
     if (analysis.isQuery()) {
       long logicalPlanCostTime = System.nanoTime() - startTime;
       QueryPlanCostMetricSet.getInstance()
-          .recordPlanCost(TABLE_TYPE, LOGICAL_PLANNER, logicalPlanCostTime);
+          .recordTablePlanCost(LOGICAL_PLANNER, logicalPlanCostTime);
       queryContext.setLogicalPlanCost(logicalPlanCostTime);
 
       startTime = System.nanoTime();
@@ -162,7 +161,7 @@ public class TableLogicalPlanner {
               - queryContext.getFetchSchemaCost();
       queryContext.setLogicalOptimizationCost(logicalOptimizationCost);
       QueryPlanCostMetricSet.getInstance()
-          .recordPlanCost(TABLE_TYPE, LOGICAL_PLAN_OPTIMIZE, 
logicalOptimizationCost);
+          .recordTablePlanCost(LOGICAL_PLAN_OPTIMIZE, logicalOptimizationCost);
     }
 
     return new LogicalQueryPlan(queryContext, planNode);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableModelPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableModelPlanner.java
index 66891fea314..f8d39ddccf0 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableModelPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableModelPlanner.java
@@ -27,6 +27,7 @@ import 
org.apache.iotdb.commons.client.sync.SyncDataNodeInternalServiceClient;
 import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.execution.QueryStateMachine;
 import org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector;
+import org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet;
 import org.apache.iotdb.db.queryengine.plan.analyze.ClusterPartitionFetcher;
 import org.apache.iotdb.db.queryengine.plan.analyze.IAnalysis;
 import org.apache.iotdb.db.queryengine.plan.planner.IPlanner;
@@ -60,6 +61,8 @@ import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ScheduledExecutorService;
 
+import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.DISTRIBUTION_PLANNER;
+
 public class TableModelPlanner implements IPlanner {
 
   private final Statement statement;
@@ -145,15 +148,26 @@ public class TableModelPlanner implements IPlanner {
 
   @Override
   public DistributedQueryPlan doDistributionPlan(
-      final IAnalysis analysis, final LogicalQueryPlan logicalPlan) {
-    return new TableDistributedPlanner(
-            (Analysis) analysis,
-            symbolAllocator,
-            logicalPlan,
-            metadata,
-            distributionPlanOptimizers,
-            dataNodeLocationSupplier)
-        .plan();
+      final IAnalysis analysis, final LogicalQueryPlan logicalPlan, 
MPPQueryContext context) {
+    long startTime = System.nanoTime();
+    try {
+      TableDistributedPlanner planner =
+          new TableDistributedPlanner(
+              (Analysis) analysis,
+              symbolAllocator,
+              logicalPlan,
+              metadata,
+              distributionPlanOptimizers,
+              dataNodeLocationSupplier);
+      return planner.plan();
+    } finally {
+      if (analysis.isQuery()) {
+        long distributionPlanCost = System.nanoTime() - startTime;
+        context.setDistributionPlanCost(distributionPlanCost);
+        QueryPlanCostMetricSet.getInstance()
+            .recordTablePlanCost(DISTRIBUTION_PLANNER, distributionPlanCost);
+      }
+    }
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanner.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanner.java
index 6f612c8552d..b537aaefdef 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanner.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/distribute/TableDistributedPlanner.java
@@ -23,7 +23,6 @@ import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
 import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import 
org.apache.iotdb.db.queryengine.execution.exchange.sink.DownStreamChannelLocation;
-import org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet;
 import org.apache.iotdb.db.queryengine.plan.analyze.QueryType;
 import 
org.apache.iotdb.db.queryengine.plan.planner.distribution.WriteFragmentParallelPlanner;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.DistributedQueryPlan;
@@ -53,8 +52,6 @@ import java.util.Map;
 import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.Objects.requireNonNull;
 import static 
org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector.NOOP;
-import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.DISTRIBUTION_PLANNER;
-import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.TABLE_TYPE;
 
 public class TableDistributedPlanner {
 
@@ -100,7 +97,6 @@ public class TableDistributedPlanner {
   }
 
   public DistributedQueryPlan plan() {
-    long startTime = System.nanoTime();
     TableDistributedPlanGenerator.PlanContext planContext =
         new TableDistributedPlanGenerator.PlanContext();
     PlanNode outputNodeWithExchange = 
generateDistributedPlanWithOptimize(planContext);
@@ -112,13 +108,8 @@ public class TableDistributedPlanner {
     }
 
     adjustUpStream(outputNodeWithExchange, planContext);
-    DistributedQueryPlan resultDistributedPlan = 
generateDistributedPlan(outputNodeWithExchange);
 
-    if (analysis.isQuery()) {
-      QueryPlanCostMetricSet.getInstance()
-          .recordPlanCost(TABLE_TYPE, DISTRIBUTION_PLANNER, System.nanoTime() 
- startTime);
-    }
-    return resultDistributedPlan;
+    return generateDistributedPlan(outputNodeWithExchange);
   }
 
   public PlanNode generateDistributedPlanWithOptimize(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
index dc943f5262d..09f376f6e49 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
@@ -93,7 +93,6 @@ import static 
org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory
 import static 
org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory.TIME;
 import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.PARTITION_FETCHER;
 import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.SCHEMA_FETCHER;
-import static 
org.apache.iotdb.db.queryengine.metric.QueryPlanCostMetricSet.TABLE_TYPE;
 import static 
org.apache.iotdb.db.queryengine.plan.analyze.AnalyzeVisitor.getTimePartitionSlotList;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.planner.ExpressionSymbolInliner.inlineSymbols;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.planner.SortOrder.ASC_NULLS_FIRST;
@@ -577,8 +576,7 @@ public class PushPredicateIntoTableScan implements 
PlanOptimizer {
       }
 
       final long schemaFetchCost = System.nanoTime() - startTime;
-      QueryPlanCostMetricSet.getInstance()
-          .recordPlanCost(TABLE_TYPE, SCHEMA_FETCHER, schemaFetchCost);
+      QueryPlanCostMetricSet.getInstance().recordTablePlanCost(SCHEMA_FETCHER, 
schemaFetchCost);
       queryContext.setFetchSchemaCost(schemaFetchCost);
 
       if (deviceEntries.isEmpty()) {
@@ -623,7 +621,7 @@ public class PushPredicateIntoTableScan implements 
PlanOptimizer {
 
         final long fetchPartitionCost = System.nanoTime() - startTime;
         QueryPlanCostMetricSet.getInstance()
-            .recordPlanCost(TABLE_TYPE, PARTITION_FETCHER, fetchPartitionCost);
+            .recordTablePlanCost(PARTITION_FETCHER, fetchPartitionCost);
         queryContext.setFetchPartitionCost(fetchPartitionCost);
       }
     }

Reply via email to