You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hu...@apache.org on 2022/11/07 03:02:02 UTC

[iotdb] branch QueryMetrics updated (6027abf211 -> b7b0555944)

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

hui pushed a change to branch QueryMetrics
in repository https://gitbox.apache.org/repos/asf/iotdb.git


    from 6027abf211 merge master
     new 9c3a999c6c support TRACING ON/OFF
     new 6fb98918bc add metrics (Parser/Analyzer/Planner)
     new b7b0555944 add metrics (Dispatcher)

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4   |  7 +++++-
 .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java  |  7 ++++++
 .../apache/iotdb/db/mpp/plan/analyze/Analyzer.java |  9 +++++++-
 .../db/mpp/plan/execution/QueryExecution.java      |  5 +++++
 .../plan/execution/config/ConfigTaskVisitor.java   |  7 ++++++
 .../config/executor/ClusterConfigTaskExecutor.java | 16 +++++++++++++
 .../config/executor/IConfigTaskExecutor.java       |  2 ++
 .../executor/StandaloneConfigTaskExecutor.java     | 13 +++++++++++
 .../sys/{MergeTask.java => TracingTask.java}       | 11 +++++----
 .../iotdb/db/mpp/plan/parser/ASTVisitor.java       |  7 ++++++
 .../iotdb/db/mpp/plan/planner/LogicalPlanner.java  |  6 +++--
 .../planner/distribution/DistributionPlanner.java  | 16 +++++++++----
 .../db/mpp/plan/statement/StatementVisitor.java    |  5 +++++
 .../TracingStatement.java}                         | 26 +++++++++++-----------
 .../iotdb/db/mpp/statistics/QueryStatistics.java   |  4 ++--
 .../service/thrift/impl/ClientRPCServiceImpl.java  |  8 ++++++-
 16 files changed, 119 insertions(+), 30 deletions(-)
 copy server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/sys/{MergeTask.java => TracingTask.java} (80%)
 copy server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/{metadata/DropFunctionStatement.java => sys/TracingStatement.java} (78%)


[iotdb] 01/03: support TRACING ON/OFF

Posted by hu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 9c3a999c6ce0797a5d1e19c1b9b288f3cf1a066c
Author: Minghui Liu <li...@foxmail.com>
AuthorDate: Mon Nov 7 10:29:50 2022 +0800

    support TRACING ON/OFF
---
 .../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4   |  7 ++-
 .../plan/execution/config/ConfigTaskVisitor.java   |  7 +++
 .../config/executor/ClusterConfigTaskExecutor.java | 16 ++++++
 .../config/executor/IConfigTaskExecutor.java       |  2 +
 .../executor/StandaloneConfigTaskExecutor.java     | 13 +++++
 .../mpp/plan/execution/config/sys/TracingTask.java | 41 +++++++++++++++
 .../iotdb/db/mpp/plan/parser/ASTVisitor.java       |  7 +++
 .../db/mpp/plan/statement/StatementVisitor.java    |  5 ++
 .../mpp/plan/statement/sys/TracingStatement.java   | 60 ++++++++++++++++++++++
 .../iotdb/db/mpp/statistics/QueryStatistics.java   |  4 +-
 10 files changed, 159 insertions(+), 3 deletions(-)

diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
index 51cb8f178d..20ab185a94 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
@@ -59,7 +59,7 @@ dclStatement
     ;
 
 utilityStatement
-    : merge | fullMerge | flush | clearCache | settle | explain
+    : merge | fullMerge | flush | clearCache | settle | explain | tracing
     | setSystemStatus | showVersion | showFlushInfo | showLockInfo | showQueryResource
     | showQueryProcesslist | killQuery | grantWatermarkEmbedding | revokeWatermarkEmbedding
     | loadConfiguration | loadTimeseries | loadFile | removeFile | unloadFile;
@@ -693,6 +693,11 @@ explain
     : EXPLAIN selectStatement
     ;
 
+// Tracing
+tracing
+    : TRACING (ON | OFF)
+    ;
+
 // Set System To readonly/running/error
 setSystemStatus
     : SET SYSTEM TO (READONLY|RUNNING) (ON (LOCAL | CLUSTER))?
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
index 1e6aa6f61e..cceed5fca8 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
@@ -57,6 +57,7 @@ import org.apache.iotdb.db.mpp.plan.execution.config.sys.FlushTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.sys.LoadConfigurationTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.sys.MergeTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.sys.SetSystemStatusTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.sys.TracingTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.sys.sync.CreatePipeSinkTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.sys.sync.CreatePipeTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.sys.sync.DropPipeSinkTask;
@@ -106,6 +107,7 @@ import org.apache.iotdb.db.mpp.plan.statement.sys.FlushStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.LoadConfigurationStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.MergeStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.SetSystemStatusStatement;
+import org.apache.iotdb.db.mpp.plan.statement.sys.TracingStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.sync.CreatePipeSinkStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.sync.CreatePipeStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.sync.DropPipeSinkStatement;
@@ -393,6 +395,11 @@ public class ConfigTaskVisitor
     return new ShowContinuousQueriesTask();
   }
 
+  @Override
+  public IConfigTask visitTracing(TracingStatement tracingStatement, TaskContext context) {
+    return new TracingTask(tracingStatement.isEnableTracing());
+  }
+
   public static class TaskContext {
 
     private final String queryId;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index 10df3d09c3..ac3d34c8a8 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -129,6 +129,7 @@ import org.apache.iotdb.db.mpp.plan.statement.sys.sync.ShowPipeSinkStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.sync.ShowPipeStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.sync.StartPipeStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.sync.StopPipeStatement;
+import org.apache.iotdb.db.mpp.statistics.QueryStatistics;
 import org.apache.iotdb.db.sync.SyncService;
 import org.apache.iotdb.db.trigger.service.TriggerClassLoader;
 import org.apache.iotdb.rpc.RpcUtils;
@@ -1441,4 +1442,19 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor {
 
     return future;
   }
+
+  @Override
+  public SettableFuture<ConfigTaskResult> tracing(boolean enableTracing) {
+    SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+    if (enableTracing) {
+      QueryStatistics.getInstance().enableTracing();
+    } else {
+      QueryStatistics.getInstance().disableTracing();
+    }
+    future.setException(
+        new IoTDBException(
+            "The statement is executed locally but not broadcast to the cluster.",
+            TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode()));
+    return future;
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
index dc79335224..fcebb26073 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
@@ -161,4 +161,6 @@ public interface IConfigTaskExecutor {
   SettableFuture<ConfigTaskResult> dropContinuousQuery(String cqId);
 
   SettableFuture<ConfigTaskResult> showContinuousQueries();
+
+  SettableFuture<ConfigTaskResult> tracing(boolean enableTracing);
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
index a0c59d4d8b..86f2c6258b 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
@@ -71,6 +71,7 @@ import org.apache.iotdb.db.mpp.plan.statement.sys.sync.ShowPipeSinkStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.sync.ShowPipeStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.sync.StartPipeStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.sync.StopPipeStatement;
+import org.apache.iotdb.db.mpp.statistics.QueryStatistics;
 import org.apache.iotdb.rpc.StatementExecutionException;
 import org.apache.iotdb.rpc.TSStatusCode;
 
@@ -712,4 +713,16 @@ public class StandaloneConfigTaskExecutor implements IConfigTaskExecutor {
             TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode()));
     return future;
   }
+
+  @Override
+  public SettableFuture<ConfigTaskResult> tracing(boolean enableTracing) {
+    SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+    if (enableTracing) {
+      QueryStatistics.getInstance().enableTracing();
+    } else {
+      QueryStatistics.getInstance().disableTracing();
+    }
+    future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
+    return future;
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/sys/TracingTask.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/sys/TracingTask.java
new file mode 100644
index 0000000000..c86e6b4577
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/sys/TracingTask.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.mpp.plan.execution.config.sys;
+
+import org.apache.iotdb.db.mpp.plan.execution.config.ConfigTaskResult;
+import org.apache.iotdb.db.mpp.plan.execution.config.IConfigTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.executor.IConfigTaskExecutor;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+public class TracingTask implements IConfigTask {
+
+  private final boolean enableTracing;
+
+  public TracingTask(boolean enableTracing) {
+    this.enableTracing = enableTracing;
+  }
+
+  @Override
+  public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor configTaskExecutor)
+      throws InterruptedException {
+    return configTaskExecutor.tracing(enableTracing);
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
index a10c09e2c4..00e42b1fba 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
@@ -145,6 +145,7 @@ import org.apache.iotdb.db.mpp.plan.statement.sys.LoadConfigurationStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.MergeStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.SetSystemStatusStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.ShowVersionStatement;
+import org.apache.iotdb.db.mpp.plan.statement.sys.TracingStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.sync.CreatePipeSinkStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.sync.CreatePipeStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.sync.DropPipeSinkStatement;
@@ -2261,6 +2262,12 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
     return new ExplainStatement(queryStatement);
   }
 
+  // Tracing ========================================================================
+  @Override
+  public Statement visitTracing(IoTDBSqlParser.TracingContext ctx) {
+    return new TracingStatement(ctx.ON() != null);
+  }
+
   @Override
   public Statement visitDeleteStatement(IoTDBSqlParser.DeleteStatementContext ctx) {
     DeleteDataStatement statement = new DeleteDataStatement();
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
index bd1d02330a..fe9c2bbea5 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
@@ -84,6 +84,7 @@ import org.apache.iotdb.db.mpp.plan.statement.sys.LoadConfigurationStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.MergeStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.SetSystemStatusStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.ShowVersionStatement;
+import org.apache.iotdb.db.mpp.plan.statement.sys.TracingStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.sync.CreatePipeSinkStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.sync.CreatePipeStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.sync.DropPipeSinkStatement;
@@ -445,4 +446,8 @@ public abstract class StatementVisitor<R, C> {
       DropSchemaTemplateStatement dropSchemaTemplateStatement, C context) {
     return visitStatement(dropSchemaTemplateStatement, context);
   }
+
+  public R visitTracing(TracingStatement tracingStatement, C context) {
+    return visitStatement(tracingStatement, context);
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/sys/TracingStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/sys/TracingStatement.java
new file mode 100644
index 0000000000..15adf675bb
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/sys/TracingStatement.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.mpp.plan.statement.sys;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.mpp.plan.analyze.QueryType;
+import org.apache.iotdb.db.mpp.plan.constant.StatementType;
+import org.apache.iotdb.db.mpp.plan.statement.IConfigStatement;
+import org.apache.iotdb.db.mpp.plan.statement.Statement;
+import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
+
+import java.util.Collections;
+import java.util.List;
+
+public class TracingStatement extends Statement implements IConfigStatement {
+
+  private final boolean enableTracing;
+
+  public TracingStatement(boolean enableTracing) {
+    super();
+    statementType = StatementType.TRACING;
+    this.enableTracing = enableTracing;
+  }
+
+  public boolean isEnableTracing() {
+    return enableTracing;
+  }
+
+  @Override
+  public QueryType getQueryType() {
+    return QueryType.WRITE;
+  }
+
+  @Override
+  public List<? extends PartialPath> getPaths() {
+    return Collections.emptyList();
+  }
+
+  @Override
+  public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
+    return visitor.visitTracing(this, context);
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/statistics/QueryStatistics.java b/server/src/main/java/org/apache/iotdb/db/mpp/statistics/QueryStatistics.java
index e61e22f3ff..df2340e335 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/statistics/QueryStatistics.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/statistics/QueryStatistics.java
@@ -78,12 +78,12 @@ public class QueryStatistics {
     }
   }
 
-  public void traceOff() {
+  public void disableTracing() {
     tracing.set(false);
     operationStatistics.clear();
   }
 
-  public void tradeOn() {
+  public void enableTracing() {
     tracing.set(true);
     operationStatistics.clear();
   }


[iotdb] 03/03: add metrics (Dispatcher)

Posted by hu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit b7b05559446e6143c708cf0cfe66098483976d90
Author: Minghui Liu <li...@foxmail.com>
AuthorDate: Mon Nov 7 11:01:25 2022 +0800

    add metrics (Dispatcher)
---
 .../java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java  | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java
index 8c48c6a574..6ba4449df0 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java
@@ -58,6 +58,7 @@ import org.apache.iotdb.db.mpp.plan.statement.crud.InsertBaseStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertMultiTabletsStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.InsertRowsStatement;
 import org.apache.iotdb.db.mpp.plan.statement.crud.LoadTsFileStatement;
+import org.apache.iotdb.db.mpp.statistics.QueryStatistics;
 import org.apache.iotdb.db.utils.SetThreadName;
 import org.apache.iotdb.rpc.RpcUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
@@ -266,6 +267,7 @@ public class QueryExecution implements IQueryExecution {
       return;
     }
     // TODO: (xingtanzjr) initialize the query scheduler according to configuration
+    long startTime = System.nanoTime();
     this.scheduler =
         config.isClusterMode()
             ? new ClusterScheduler(
@@ -285,6 +287,9 @@ public class QueryExecution implements IQueryExecution {
                 scheduledExecutor,
                 internalServiceClientManager);
     this.scheduler.start();
+    if (rawStatement.isQuery()) {
+      QueryStatistics.getInstance().addCost("Dispatcher", System.nanoTime() - startTime);
+    }
   }
 
   // Use LogicalPlanner to do the logical query plan and logical optimization


[iotdb] 02/03: add metrics (Parser/Analyzer/Planner)

Posted by hu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 6fb98918bcdc921dbf6fa46d3b7d80c5d8e30571
Author: Minghui Liu <li...@foxmail.com>
AuthorDate: Mon Nov 7 10:57:58 2022 +0800

    add metrics (Parser/Analyzer/Planner)
---
 .../apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java |  7 +++++++
 .../org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java   |  9 ++++++++-
 .../apache/iotdb/db/mpp/plan/planner/LogicalPlanner.java |  6 ++++--
 .../plan/planner/distribution/DistributionPlanner.java   | 16 ++++++++++++----
 .../db/service/thrift/impl/ClientRPCServiceImpl.java     |  8 +++++++-
 5 files changed, 38 insertions(+), 8 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
index cf6acaa2f9..392e0ae6d9 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
@@ -105,6 +105,7 @@ import org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTempla
 import org.apache.iotdb.db.mpp.plan.statement.sys.ExplainStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.ShowVersionStatement;
 import org.apache.iotdb.db.mpp.plan.statement.sys.sync.ShowPipeSinkTypeStatement;
+import org.apache.iotdb.db.mpp.statistics.QueryStatistics;
 import org.apache.iotdb.db.query.control.SessionManager;
 import org.apache.iotdb.db.utils.FileLoaderUtils;
 import org.apache.iotdb.db.utils.TimePartitionUtils;
@@ -196,11 +197,15 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       // request schema fetch API
       logger.debug("[StartFetchSchema]");
       ISchemaTree schemaTree;
+
+      long t1 = System.nanoTime();
       if (queryStatement.isGroupByTag()) {
         schemaTree = schemaFetcher.fetchSchemaWithTags(patternTree);
       } else {
         schemaTree = schemaFetcher.fetchSchema(patternTree);
       }
+      QueryStatistics.getInstance().addCost("SchemaFetcher", System.nanoTime() - t1);
+
       logger.debug("[EndFetchSchema]");
       // If there is no leaf node in the schema tree, the query should be completed immediately
       if (schemaTree.isEmpty()) {
@@ -278,7 +283,9 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       analyzeOutput(analysis, queryStatement, outputExpressions);
 
       // fetch partition information
+      long t2 = System.nanoTime();
       analyzeDataPartition(analysis, queryStatement, schemaTree);
+      QueryStatistics.getInstance().addCost("PartitionFetcher", System.nanoTime() - t2);
 
     } catch (StatementAnalyzeException e) {
       logger.error("Meet error when analyzing the query statement: ", e);
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java
index 010b491e55..6fed101bc3 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java
@@ -22,6 +22,7 @@ package org.apache.iotdb.db.mpp.plan.analyze;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.mpp.common.MPPQueryContext;
 import org.apache.iotdb.db.mpp.plan.statement.Statement;
+import org.apache.iotdb.db.mpp.statistics.QueryStatistics;
 
 import static org.apache.iotdb.db.mpp.common.QueryId.mockQueryId;
 
@@ -40,7 +41,13 @@ public class Analyzer {
   }
 
   public Analysis analyze(Statement statement) {
-    return new AnalyzeVisitor(partitionFetcher, schemaFetcher).process(statement, context);
+    long startTime = System.nanoTime();
+    Analysis analysis =
+        new AnalyzeVisitor(partitionFetcher, schemaFetcher).process(statement, context);
+    if (statement.isQuery()) {
+      QueryStatistics.getInstance().addCost("Analyzer", System.nanoTime() - startTime);
+    }
+    return analysis;
   }
 
   public static void validate(Statement statement) {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanner.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanner.java
index 308887f53a..a894c8ddf0 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanner.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LogicalPlanner.java
@@ -23,7 +23,7 @@ import org.apache.iotdb.db.mpp.plan.analyze.Analysis;
 import org.apache.iotdb.db.mpp.plan.optimization.PlanOptimizer;
 import org.apache.iotdb.db.mpp.plan.planner.plan.LogicalQueryPlan;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
-import org.apache.iotdb.db.mpp.plan.statement.crud.QueryStatement;
+import org.apache.iotdb.db.mpp.statistics.QueryStatistics;
 
 import java.util.List;
 
@@ -39,10 +39,12 @@ public class LogicalPlanner {
   }
 
   public LogicalQueryPlan plan(Analysis analysis) {
+    long startTime = System.nanoTime();
     PlanNode rootNode = new LogicalPlanVisitor(analysis).process(analysis.getStatement(), context);
 
     // optimize the query logical plan
-    if (analysis.getStatement() instanceof QueryStatement) {
+    if (analysis.getStatement().isQuery()) {
+      QueryStatistics.getInstance().addCost("LogicalPlanner", System.nanoTime() - startTime);
       for (PlanOptimizer optimizer : optimizers) {
         rootNode = optimizer.optimize(rootNode, context);
       }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/DistributionPlanner.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/DistributionPlanner.java
index 60882f5cdf..2b2a69188c 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/DistributionPlanner.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/distribution/DistributionPlanner.java
@@ -32,7 +32,7 @@ import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.WritePlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.ExchangeNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.sink.FragmentSinkNode;
-import org.apache.iotdb.db.mpp.plan.statement.crud.QueryStatement;
+import org.apache.iotdb.db.mpp.statistics.QueryStatistics;
 
 import java.util.List;
 
@@ -65,9 +65,11 @@ public class DistributionPlanner {
   }
 
   public DistributedQueryPlan planFragments() {
+    long startTime = System.nanoTime();
+
     PlanNode rootAfterRewrite = rewriteSource();
     PlanNode rootWithExchange = addExchangeNode(rootAfterRewrite);
-    if (analysis.getStatement() instanceof QueryStatement) {
+    if (analysis.getStatement().isQuery()) {
       analysis
           .getRespDatasetHeader()
           .setColumnToTsBlockIndexMap(rootWithExchange.getOutputColumnNames());
@@ -80,8 +82,14 @@ public class DistributionPlanner {
     if (context.getQueryType() == QueryType.READ) {
       SetSinkForRootInstance(subPlan, fragmentInstances);
     }
-    return new DistributedQueryPlan(
-        logicalPlan.getContext(), subPlan, subPlan.getPlanFragmentList(), fragmentInstances);
+    DistributedQueryPlan distributedQueryPlan =
+        new DistributedQueryPlan(
+            logicalPlan.getContext(), subPlan, subPlan.getPlanFragmentList(), fragmentInstances);
+
+    if (analysis.getStatement().isQuery()) {
+      QueryStatistics.getInstance().addCost("DistributionPlanner", System.nanoTime() - startTime);
+    }
+    return distributedQueryPlan;
   }
 
   // Convert fragment to detailed instance
diff --git a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/ClientRPCServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/ClientRPCServiceImpl.java
index e002d89ad5..4ab5592612 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/ClientRPCServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/ClientRPCServiceImpl.java
@@ -59,6 +59,7 @@ import org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemp
 import org.apache.iotdb.db.mpp.plan.statement.metadata.template.DropSchemaTemplateStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.template.SetSchemaTemplateStatement;
 import org.apache.iotdb.db.mpp.plan.statement.metadata.template.UnsetSchemaTemplateStatement;
+import org.apache.iotdb.db.mpp.statistics.QueryStatistics;
 import org.apache.iotdb.db.query.control.SessionManager;
 import org.apache.iotdb.db.query.control.clientsession.IClientSession;
 import org.apache.iotdb.db.service.basic.BasicOpenSessionResp;
@@ -190,16 +191,21 @@ public class ClientRPCServiceImpl implements IClientRPCServiceWithHandler {
     }
 
     long startTime = System.currentTimeMillis();
+    long startTimeInNano = System.nanoTime();
     try {
       Statement s =
           StatementGenerator.createStatement(
               statement, SESSION_MANAGER.getCurrSession().getZoneId());
-
       if (s == null) {
         return RpcUtils.getTSExecuteStatementResp(
             RpcUtils.getStatus(
                 TSStatusCode.SQL_PARSE_ERROR, "This operation type is not supported"));
       }
+
+      if (s.isQuery()) {
+        QueryStatistics.getInstance().addCost("Parser", System.nanoTime() - startTimeInNano);
+      }
+
       // permission check
       TSStatus status = AuthorityChecker.checkAuthority(s, SESSION_MANAGER.getCurrSession());
       if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {