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

ycycse pushed a commit to branch ycy/fixEA
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit a8d1e9e3d5934f36721604bf327e57f657a5881c
Author: ycycse <[email protected]>
AuthorDate: Thu Jul 11 17:01:14 2024 +0800

    feat: modify the metric in ExplainAnalyze
---
 .../apache/iotdb/db/queryengine/common/MPPQueryContext.java   | 11 +++++++++++
 .../db/queryengine/execution/fragment/QueryStatistics.java    |  3 ++-
 .../execution/operator/process/FilterAndProjectOperator.java  |  4 +++-
 .../plan/scheduler/FragmentInstanceDispatcherImpl.java        |  5 +++--
 .../statistics/FragmentInstanceStatisticsDrawer.java          |  9 +++++++++
 .../iotdb/db/queryengine/statistics/QueryPlanStatistics.java  |  9 +++++++++
 .../thrift-datanode/src/main/thrift/datanode.thrift           |  3 ++-
 7 files changed, 39 insertions(+), 5 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
index ed4516223b5..b8ac5a4fb31 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
@@ -258,6 +258,10 @@ public class MPPQueryContext {
     return queryPlanStatistics.getLogicalOptimizationCost();
   }
 
+  public long getDispatchCost() {
+    return queryPlanStatistics.getDispatchCost();
+  }
+
   public void setAnalyzeCost(long analyzeCost) {
     if (queryPlanStatistics == null) {
       queryPlanStatistics = new QueryPlanStatistics();
@@ -300,6 +304,13 @@ public class MPPQueryContext {
     queryPlanStatistics.setLogicalOptimizationCost(logicalOptimizeCost);
   }
 
+  public void recordDispatchCost(long dispatchCost) {
+    if (queryPlanStatistics == null) {
+      queryPlanStatistics = new QueryPlanStatistics();
+    }
+    queryPlanStatistics.recordDispatchCost(dispatchCost);
+  }
+
   // region =========== FE memory related, make sure its not called 
concurrently ===========
 
   /**
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/QueryStatistics.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/QueryStatistics.java
index 82094467034..52c9f42c12a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/QueryStatistics.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/QueryStatistics.java
@@ -104,6 +104,7 @@ public class QueryStatistics {
         pageReadersDecodeNonAlignedDiskCount.get(),
         pageReadersDecodeNonAlignedDiskTime.get(),
         pageReadersDecodeNonAlignedMemCount.get(),
-        pageReadersDecodeNonAlignedMemTime.get());
+        pageReadersDecodeNonAlignedMemTime.get(),
+        pageReaderMaxUsedMemorySize.get());
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/FilterAndProjectOperator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/FilterAndProjectOperator.java
index 407874ae8b3..654e8bf15ec 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/FilterAndProjectOperator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/FilterAndProjectOperator.java
@@ -72,6 +72,8 @@ public class FilterAndProjectOperator implements 
ProcessOperator {
   // false when we only need to do projection
   private final boolean hasFilter;
 
+  private long filteredRowCount = 0;
+
   @SuppressWarnings("squid:S107")
   public FilterAndProjectOperator(
       OperatorContext operatorContext,
@@ -114,7 +116,7 @@ public class FilterAndProjectOperator implements 
ProcessOperator {
 
     long inputRowCount = input.getPositionCount();
     TsBlock filterResult = getFilterTsBlock(input);
-    long filteredRowCount =
+    filteredRowCount +=
         filterResult == null ? inputRowCount : inputRowCount - 
filterResult.getPositionCount();
     operatorContext.recordSpecifiedInfo("Filtered Rows", 
Long.toString(filteredRowCount));
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/FragmentInstanceDispatcherImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/FragmentInstanceDispatcherImpl.java
index 7fe941a6f83..2b0738ea59f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/FragmentInstanceDispatcherImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/FragmentInstanceDispatcherImpl.java
@@ -146,8 +146,9 @@ public class FragmentInstanceDispatcherImpl implements 
IFragInstanceDispatcher {
           // TypeProvider is not used in EXPLAIN ANALYZE, so we can clear it
           instance.getFragment().clearTypeProvider();
         }
-        QUERY_EXECUTION_METRIC_SET.recordExecutionCost(
-            DISPATCH_READ, System.nanoTime() - startTime);
+        long dispatchReadTime = System.nanoTime() - startTime;
+        QUERY_EXECUTION_METRIC_SET.recordExecutionCost(DISPATCH_READ, 
dispatchReadTime);
+        queryContext.recordDispatchCost(dispatchReadTime);
       }
     }
     return immediateFuture(new FragInstanceDispatchResult(true));
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/FragmentInstanceStatisticsDrawer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/FragmentInstanceStatisticsDrawer.java
index e7ca8ab887e..41a4f368528 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/FragmentInstanceStatisticsDrawer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/FragmentInstanceStatisticsDrawer.java
@@ -69,6 +69,10 @@ public class FragmentInstanceStatisticsDrawer {
         String.format(
             "Distribution Plan Cost: %.3f ms",
             context.getDistributionPlanCost() * NS_TO_MS_FACTOR));
+    addLine(
+        planHeader,
+        0,
+        String.format("Dispatch Cost: %.3f ms", context.getDispatchCost() * 
NS_TO_MS_FACTOR));
   }
 
   public List<StatisticLine> renderFragmentInstances(
@@ -324,6 +328,11 @@ public class FragmentInstanceStatisticsDrawer {
         2,
         "pageReadersDecodeNonAlignedMemTime",
         queryStatistics.pageReadersDecodeNonAlignedMemTime * NS_TO_MS_FACTOR);
+    addLineWithValueCheck(
+        singleFragmentInstanceArea,
+        2,
+        "pageReaderMaxUsedMemorySize",
+        queryStatistics.pageReaderMaxUsedMemorySize);
   }
 
   private void addLine(List<StatisticLine> resultForSingleInstance, int level, 
String value) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/QueryPlanStatistics.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/QueryPlanStatistics.java
index cb8a4a6a8c6..845934aae1b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/QueryPlanStatistics.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/statistics/QueryPlanStatistics.java
@@ -26,6 +26,7 @@ public class QueryPlanStatistics {
   private long logicalPlanCost;
   private long logicalOptimizationCost;
   private long distributionPlanCost;
+  private long dispatchCost = 0;
 
   public void setAnalyzeCost(long analyzeCost) {
     this.analyzeCost = analyzeCost;
@@ -51,6 +52,10 @@ public class QueryPlanStatistics {
     this.logicalOptimizationCost = logicalOptimizationCost;
   }
 
+  public void recordDispatchCost(long dispatchCost) {
+    this.dispatchCost += dispatchCost;
+  }
+
   public long getAnalyzeCost() {
     return analyzeCost;
   }
@@ -74,4 +79,8 @@ public class QueryPlanStatistics {
   public long getLogicalOptimizationCost() {
     return logicalOptimizationCost;
   }
+
+  public long getDispatchCost() {
+    return dispatchCost;
+  }
 }
diff --git a/iotdb-protocol/thrift-datanode/src/main/thrift/datanode.thrift 
b/iotdb-protocol/thrift-datanode/src/main/thrift/datanode.thrift
index 60e605a6a34..a568d961bfb 100644
--- a/iotdb-protocol/thrift-datanode/src/main/thrift/datanode.thrift
+++ b/iotdb-protocol/thrift-datanode/src/main/thrift/datanode.thrift
@@ -592,7 +592,8 @@ struct TQueryStatistics {
   29: i64 pageReadersDecodeNonAlignedDiskCount,
   30: i64 pageReadersDecodeNonAlignedDiskTime,
   31: i64 pageReadersDecodeNonAlignedMemCount,
-  32: i64 pageReadersDecodeNonAlignedMemTime
+  32: i64 pageReadersDecodeNonAlignedMemTime,
+  33: i64 pageReaderMaxUsedMemorySize
 }
 
 

Reply via email to