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