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

caogaofei 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 010843f8933 Optimized the show/query devices logic to only return 
required attributes & Reduced unnecessary CPU usage in schema tsBlock building 
(#15109)
010843f8933 is described below

commit 010843f89336e1e1f646f6b84b5040541e5b7c02
Author: Caideyipi <[email protected]>
AuthorDate: Tue Mar 18 07:20:07 2025 +0800

    Optimized the show/query devices logic to only return required attributes & 
Reduced unnecessary CPU usage in schema tsBlock building (#15109)
---
 .../schema/source/DeviceAttributeUpdater.java      | 10 ++-----
 .../schema/source/DeviceBlackListConstructor.java  | 11 ++++----
 .../schema/source/DevicePredicateFilter.java       | 13 ++-------
 .../schema/source/DevicePredicateHandler.java      | 22 ++++++---------
 .../operator/schema/source/DeviceUpdater.java      | 13 ++-------
 .../schema/source/SchemaSourceFactory.java         |  4 ++-
 .../schema/source/TableDeviceQuerySource.java      | 21 ++++++--------
 .../plan/planner/TableOperatorGenerator.java       | 23 ++++++++++-----
 .../metadata/fetcher/TableDeviceSchemaFetcher.java |  5 ++++
 .../relational/planner/TableLogicalPlanner.java    |  2 +-
 .../sql/ast/AbstractQueryDeviceWithCache.java      | 33 +++++++++++++++-------
 .../relational/sql/ast/AbstractTraverseDevice.java |  9 +++++-
 .../plan/relational/sql/ast/DeleteDevice.java      | 19 ++++++-------
 .../plan/relational/sql/ast/ShowDevice.java        | 10 ++++++-
 .../schemaregion/impl/SchemaRegionMemoryImpl.java  | 29 +++++++++++--------
 15 files changed, 122 insertions(+), 102 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DeviceAttributeUpdater.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DeviceAttributeUpdater.java
index a1d04887145..bfb65062ee2 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DeviceAttributeUpdater.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DeviceAttributeUpdater.java
@@ -20,8 +20,8 @@
 package org.apache.iotdb.db.queryengine.execution.operator.schema.source;
 
 import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.commons.schema.column.ColumnHeader;
 import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
 import 
org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransformer;
 import 
org.apache.iotdb.db.queryengine.transformation.dag.column.leaf.LeafColumnTransformer;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.IMemMNode;
@@ -62,9 +62,7 @@ public class DeviceAttributeUpdater extends DeviceUpdater {
       final List<LeafColumnTransformer> filterLeafColumnTransformerList,
       final ColumnTransformer filterOutputTransformer,
       final List<ColumnTransformer> commonTransformerList,
-      final String database,
-      final String tableName,
-      final List<ColumnHeader> columnHeaderList,
+      final List<TsTableColumnSchema> columnSchemaList,
       final List<LeafColumnTransformer> projectLeafColumnTransformerList,
       final List<ColumnTransformer> projectOutputTransformerList,
       final BiFunction<Integer, String, Binary> attributeProvider,
@@ -73,9 +71,7 @@ public class DeviceAttributeUpdater extends DeviceUpdater {
     super(
         filterLeafColumnTransformerList,
         filterOutputTransformer,
-        database,
-        tableName,
-        columnHeaderList,
+        columnSchemaList,
         attributeProvider);
     this.commonTransformerList = commonTransformerList;
     this.projectLeafColumnTransformerList = projectLeafColumnTransformerList;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DeviceBlackListConstructor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DeviceBlackListConstructor.java
index d29a9ea65c3..17be17486da 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DeviceBlackListConstructor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DeviceBlackListConstructor.java
@@ -20,8 +20,8 @@
 package org.apache.iotdb.db.queryengine.execution.operator.schema.source;
 
 import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.commons.schema.column.ColumnHeader;
 import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
 import 
org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransformer;
 import 
org.apache.iotdb.db.queryengine.transformation.dag.column.leaf.LeafColumnTransformer;
 import org.apache.iotdb.db.schemaengine.rescon.MemSchemaRegionStatistics;
@@ -39,22 +39,21 @@ public class DeviceBlackListConstructor extends 
DeviceUpdater {
 
   private long preDeletedNum = 0;
   private final MemSchemaRegionStatistics regionStatistics;
+  private final String tableName;
 
   public DeviceBlackListConstructor(
       final List<LeafColumnTransformer> filterLeafColumnTransformerList,
       final ColumnTransformer filterOutputTransformer,
-      final String database,
       final String tableName,
-      final List<ColumnHeader> columnHeaderList,
+      final List<TsTableColumnSchema> columnSchemaList,
       final BiFunction<Integer, String, Binary> attributeProvider,
       final MemSchemaRegionStatistics regionStatistics) {
     super(
         filterLeafColumnTransformerList,
         filterOutputTransformer,
-        database,
-        tableName,
-        columnHeaderList,
+        columnSchemaList,
         attributeProvider);
+    this.tableName = tableName;
     this.regionStatistics = regionStatistics;
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DevicePredicateFilter.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DevicePredicateFilter.java
index 055a22460b2..037ac6ffebe 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DevicePredicateFilter.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DevicePredicateFilter.java
@@ -19,7 +19,7 @@
 
 package org.apache.iotdb.db.queryengine.execution.operator.schema.source;
 
-import org.apache.iotdb.commons.schema.column.ColumnHeader;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
 import 
org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransformer;
 import 
org.apache.iotdb.db.queryengine.transformation.dag.column.leaf.LeafColumnTransformer;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.read.resp.info.IDeviceSchemaInfo;
@@ -37,15 +37,8 @@ public class DevicePredicateFilter extends 
DevicePredicateHandler
   public DevicePredicateFilter(
       final List<LeafColumnTransformer> filterLeafColumnTransformerList,
       final ColumnTransformer filterOutputTransformer,
-      final String database,
-      final String tableName,
-      final List<ColumnHeader> columnHeaderList) {
-    super(
-        filterLeafColumnTransformerList,
-        filterOutputTransformer,
-        database,
-        tableName,
-        columnHeaderList);
+      final List<TsTableColumnSchema> columnSchemaList) {
+    super(filterLeafColumnTransformerList, filterOutputTransformer, 
columnSchemaList);
     requireNonNull(filterOutputTransformer);
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DevicePredicateHandler.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DevicePredicateHandler.java
index a33f17f002d..47611a72a28 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DevicePredicateHandler.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DevicePredicateHandler.java
@@ -20,7 +20,7 @@
 package org.apache.iotdb.db.queryengine.execution.operator.schema.source;
 
 import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.commons.schema.column.ColumnHeader;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
 import 
org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransformer;
 import 
org.apache.iotdb.db.queryengine.transformation.dag.column.leaf.LeafColumnTransformer;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.read.resp.info.IDeviceSchemaInfo;
@@ -43,9 +43,7 @@ public abstract class DevicePredicateHandler implements 
AutoCloseable {
   private final List<LeafColumnTransformer> filterLeafColumnTransformerList;
   protected final ColumnTransformer filterOutputTransformer;
   private final List<TSDataType> inputDataTypes;
-  private final String database;
-  protected final String tableName;
-  private final List<ColumnHeader> columnHeaderList;
+  private final List<TsTableColumnSchema> columnSchemaList;
 
   // Batch logic
   protected static final int DEFAULT_MAX_TS_BLOCK_LINE_NUMBER =
@@ -60,16 +58,14 @@ public abstract class DevicePredicateHandler implements 
AutoCloseable {
   protected DevicePredicateHandler(
       final List<LeafColumnTransformer> filterLeafColumnTransformerList,
       final ColumnTransformer filterOutputTransformer,
-      final String database,
-      final String tableName,
-      final List<ColumnHeader> columnHeaderList) {
+      final List<TsTableColumnSchema> columnSchemaList) {
     this.filterLeafColumnTransformerList = filterLeafColumnTransformerList;
     this.filterOutputTransformer = filterOutputTransformer;
-    this.database = database;
-    this.tableName = tableName;
-    this.columnHeaderList = columnHeaderList;
+    this.columnSchemaList = columnSchemaList;
     this.inputDataTypes =
-        
columnHeaderList.stream().map(ColumnHeader::getColumnType).collect(Collectors.toList());
+        columnSchemaList.stream()
+            .map(TsTableColumnSchema::getDataType)
+            .collect(Collectors.toList());
   }
 
   public void addBatch(final IDeviceSchemaInfo deviceSchemaInfo) {
@@ -93,9 +89,7 @@ public abstract class DevicePredicateHandler implements 
AutoCloseable {
     final TsBlockBuilder builder = new TsBlockBuilder(inputDataTypes);
     deviceSchemaBatch.forEach(
         deviceSchemaInfo ->
-            transformToTsBlockColumns(
-                deviceSchemaInfo, builder, database, tableName, 
columnHeaderList, 3));
-
+            transformToTsBlockColumns(deviceSchemaInfo, builder, 
columnSchemaList, 3));
     curBlock = builder.build();
     if (withoutFilter()) {
       return;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DeviceUpdater.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DeviceUpdater.java
index 1a5e5e4632c..33191633380 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DeviceUpdater.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DeviceUpdater.java
@@ -20,8 +20,8 @@
 package org.apache.iotdb.db.queryengine.execution.operator.schema.source;
 
 import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.commons.schema.column.ColumnHeader;
 import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
 import 
org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransformer;
 import 
org.apache.iotdb.db.queryengine.transformation.dag.column.leaf.LeafColumnTransformer;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.IMemMNode;
@@ -40,16 +40,9 @@ public abstract class DeviceUpdater extends 
DevicePredicateHandler {
   protected DeviceUpdater(
       final List<LeafColumnTransformer> filterLeafColumnTransformerList,
       final ColumnTransformer filterOutputTransformer,
-      final String database,
-      final String tableName,
-      final List<ColumnHeader> columnHeaderList,
+      final List<TsTableColumnSchema> columnSchemaList,
       final BiFunction<Integer, String, Binary> attributeProvider) {
-    super(
-        filterLeafColumnTransformerList,
-        filterOutputTransformer,
-        database,
-        tableName,
-        columnHeaderList);
+    super(filterLeafColumnTransformerList, filterOutputTransformer, 
columnSchemaList);
     this.attributeProvider = attributeProvider;
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/SchemaSourceFactory.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/SchemaSourceFactory.java
index 56f0964ce19..69940cb6598 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/SchemaSourceFactory.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/SchemaSourceFactory.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.path.PathPatternTree;
 import org.apache.iotdb.commons.schema.column.ColumnHeader;
 import org.apache.iotdb.commons.schema.filter.SchemaFilter;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.read.resp.info.IDeviceSchemaInfo;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.read.resp.info.INodeSchemaInfo;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.read.resp.info.ITimeSeriesSchemaInfo;
@@ -113,8 +114,9 @@ public class SchemaSourceFactory {
       final String tableName,
       final List<List<SchemaFilter>> idDeterminedFilterList,
       final List<ColumnHeader> columnHeaderList,
+      final List<TsTableColumnSchema> columnSchemaList,
       final DevicePredicateFilter filter) {
     return new TableDeviceQuerySource(
-        database, tableName, idDeterminedFilterList, columnHeaderList, filter);
+        database, tableName, idDeterminedFilterList, columnHeaderList, 
columnSchemaList, filter);
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/TableDeviceQuerySource.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/TableDeviceQuerySource.java
index 89ba70c7cd3..f502e0c422e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/TableDeviceQuerySource.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/TableDeviceQuerySource.java
@@ -25,7 +25,6 @@ import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.schema.column.ColumnHeader;
 import org.apache.iotdb.commons.schema.filter.SchemaFilter;
 import org.apache.iotdb.commons.schema.filter.impl.DeviceFilterUtil;
-import org.apache.iotdb.commons.schema.table.TsTable;
 import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
 import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
 import 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl;
@@ -51,13 +50,12 @@ import java.util.Objects;
 
 public class TableDeviceQuerySource implements 
ISchemaSource<IDeviceSchemaInfo> {
 
-  private final String database;
-
   private final String tableName;
 
   private final List<List<SchemaFilter>> idDeterminedPredicateList;
 
   private final List<ColumnHeader> columnHeaderList;
+  private final List<TsTableColumnSchema> columnSchemaList;
   private final DevicePredicateFilter filter;
   private @Nonnull List<PartialPath> devicePatternList;
 
@@ -66,11 +64,13 @@ public class TableDeviceQuerySource implements 
ISchemaSource<IDeviceSchemaInfo>
       final String tableName,
       final List<List<SchemaFilter>> idDeterminedPredicateList,
       final List<ColumnHeader> columnHeaderList,
+      final List<TsTableColumnSchema> columnSchemaList,
       final DevicePredicateFilter filter) {
-    this.database = database;
     this.tableName = tableName;
     this.idDeterminedPredicateList = idDeterminedPredicateList;
     this.columnHeaderList = columnHeaderList;
+    // Calculate this outside to save cpu
+    this.columnSchemaList = columnSchemaList;
     this.filter = filter;
     this.devicePatternList = getDevicePatternList(database, tableName, 
idDeterminedPredicateList);
   }
@@ -214,23 +214,18 @@ public class TableDeviceQuerySource implements 
ISchemaSource<IDeviceSchemaInfo>
   @Override
   public void transformToTsBlockColumns(
       final IDeviceSchemaInfo schemaInfo, final TsBlockBuilder builder, final 
String database) {
-    transformToTsBlockColumns(schemaInfo, builder, database, tableName, 
columnHeaderList, 3);
+    transformToTsBlockColumns(schemaInfo, builder, columnSchemaList, 3);
   }
 
   public static void transformToTsBlockColumns(
       final IDeviceSchemaInfo schemaInfo,
       final TsBlockBuilder builder,
-      final String database,
-      final String tableName,
-      final List<ColumnHeader> columnHeaderList,
+      final List<TsTableColumnSchema> columnSchemaList,
       int idIndex) {
     builder.getTimeColumnBuilder().writeLong(0L);
     int resultIndex = 0;
     final String[] pathNodes = schemaInfo.getRawNodes();
-    final TsTable table = DataNodeTableCache.getInstance().getTable(database, 
tableName);
-    TsTableColumnSchema columnSchema;
-    for (final ColumnHeader columnHeader : columnHeaderList) {
-      columnSchema = table.getColumnSchema(columnHeader.getColumnName());
+    for (final TsTableColumnSchema columnSchema : columnSchemaList) {
       if (columnSchema.getColumnCategory().equals(TsTableColumnCategory.TAG)) {
         if (pathNodes.length <= idIndex || pathNodes[idIndex] == null) {
           builder.getColumnBuilder(resultIndex).appendNull();
@@ -241,7 +236,7 @@ public class TableDeviceQuerySource implements 
ISchemaSource<IDeviceSchemaInfo>
         }
         idIndex++;
       } else if 
(columnSchema.getColumnCategory().equals(TsTableColumnCategory.ATTRIBUTE)) {
-        final Binary attributeValue = 
schemaInfo.getAttributeValue(columnHeader.getColumnName());
+        final Binary attributeValue = 
schemaInfo.getAttributeValue(columnSchema.getColumnName());
         if (attributeValue == null) {
           builder.getColumnBuilder(resultIndex).appendNull();
         } else {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
index bbd94c59614..40a204aa9f3 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/TableOperatorGenerator.java
@@ -24,7 +24,8 @@ import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.AlignedFullPath;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.commons.schema.column.ColumnHeader;
+import org.apache.iotdb.commons.schema.table.TsTable;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.sql.SemanticException;
 import org.apache.iotdb.db.queryengine.common.FragmentInstanceId;
@@ -174,6 +175,7 @@ import 
org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransform
 import 
org.apache.iotdb.db.queryengine.transformation.dag.column.leaf.LeafColumnTransformer;
 import 
org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.DateBinFunctionColumnTransformer;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.read.resp.info.IDeviceSchemaInfo;
+import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache;
 import org.apache.iotdb.db.utils.datastructure.SortKey;
 import org.apache.iotdb.udf.api.relational.TableFunction;
 import 
org.apache.iotdb.udf.api.relational.table.TableFunctionProcessorProvider;
@@ -1679,6 +1681,8 @@ public class TableOperatorGenerator extends 
PlanVisitor<Operator, LocalExecution
   public Operator visitTableDeviceQueryScan(
       final TableDeviceQueryScanNode node, final LocalExecutionPlanContext 
context) {
     // Query scan use filterNode directly
+    final TsTable table =
+        DataNodeTableCache.getInstance().getTable(node.getDatabase(), 
node.getTableName());
     final SchemaQueryScanOperator<IDeviceSchemaInfo> operator =
         new SchemaQueryScanOperator<>(
             node.getPlanNodeId(),
@@ -1693,6 +1697,9 @@ public class TableOperatorGenerator extends 
PlanVisitor<Operator, LocalExecution
                 node.getTableName(),
                 node.getIdDeterminedFilterList(),
                 node.getColumnHeaderList(),
+                node.getColumnHeaderList().stream()
+                    .map(columnHeader -> 
table.getColumnSchema(columnHeader.getColumnName()))
+                    .collect(Collectors.toList()),
                 null));
     operator.setLimit(node.getLimit());
     return operator;
@@ -1702,8 +1709,11 @@ public class TableOperatorGenerator extends 
PlanVisitor<Operator, LocalExecution
   public Operator visitTableDeviceQueryCount(
       final TableDeviceQueryCountNode node, final LocalExecutionPlanContext 
context) {
     final String database = node.getDatabase();
-    final String tableName = node.getTableName();
-    final List<ColumnHeader> columnHeaderList = node.getColumnHeaderList();
+    final TsTable table = DataNodeTableCache.getInstance().getTable(database, 
node.getTableName());
+    final List<TsTableColumnSchema> columnSchemaList =
+        node.getColumnHeaderList().stream()
+            .map(columnHeader -> 
table.getColumnSchema(columnHeader.getColumnName()))
+            .collect(Collectors.toList());
 
     // In "count" we have to reuse filter operator per "next"
     final List<LeafColumnTransformer> filterLeafColumnTransformerList = new 
ArrayList<>();
@@ -1719,7 +1729,8 @@ public class TableOperatorGenerator extends 
PlanVisitor<Operator, LocalExecution
             database,
             node.getTableName(),
             node.getIdDeterminedFilterList(),
-            columnHeaderList,
+            node.getColumnHeaderList(),
+            columnSchemaList,
             Objects.nonNull(node.getIdFuzzyPredicate())
                 ? new DevicePredicateFilter(
                     filterLeafColumnTransformerList,
@@ -1740,9 +1751,7 @@ public class TableOperatorGenerator extends 
PlanVisitor<Operator, LocalExecution
                                 0,
                                 context.getTypeProvider(),
                                 metadata)),
-                    database,
-                    tableName,
-                    columnHeaderList)
+                    columnSchemaList)
                 : null));
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java
index 0d41536e79e..0c17810684a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java
@@ -304,6 +304,11 @@ public class TableDeviceSchemaFetcher {
       statement.setIdDeterminedFilterList(idPredicateForFetch);
       statement.setIdFuzzyPredicate(compactedIdFuzzyPredicate);
       statement.setPartitionKeyList(fetchPaths);
+      // Return only the required attributes for non-schema queries
+      // if there is no need to put to cache
+      if (!isDirectDeviceQuery && Objects.isNull(fetchPaths)) {
+        statement.setAttributeColumns(attributeColumns);
+      }
       return true;
     }
     return false;
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 b7cac999941..c9bfb879181 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
@@ -332,7 +332,7 @@ public class TableLogicalPlanner {
 
   private PlanNode planFetchDevice(final FetchDevice statement, final Analysis 
analysis) {
     final List<ColumnHeader> columnHeaderList =
-        getDeviceColumnHeaderList(statement.getDatabase(), 
statement.getTableName());
+        getDeviceColumnHeaderList(statement.getDatabase(), 
statement.getTableName(), null);
 
     analysis.setRespDatasetHeader(new DatasetHeader(columnHeaderList, true));
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AbstractQueryDeviceWithCache.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AbstractQueryDeviceWithCache.java
index 7f43347a0a1..4ac420dbc3e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AbstractQueryDeviceWithCache.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AbstractQueryDeviceWithCache.java
@@ -35,6 +35,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 public abstract class AbstractQueryDeviceWithCache extends 
AbstractTraverseDevice {
 
@@ -75,16 +76,28 @@ public abstract class AbstractQueryDeviceWithCache extends 
AbstractTraverseDevic
   }
 
   public static List<ColumnHeader> getDeviceColumnHeaderList(
-      final String database, final String tableName) {
-    return DataNodeTableCache.getInstance().getTable(database, 
tableName).getColumnList().stream()
-        .filter(
-            columnSchema ->
-                
columnSchema.getColumnCategory().equals(TsTableColumnCategory.TAG)
-                    || 
columnSchema.getColumnCategory().equals(TsTableColumnCategory.ATTRIBUTE))
-        .map(
-            columnSchema ->
-                new ColumnHeader(columnSchema.getColumnName(), 
columnSchema.getDataType()))
-        .collect(Collectors.toList());
+      final String database, final String tableName, final List<String> 
attributeColumns) {
+    final TsTable table = DataNodeTableCache.getInstance().getTable(database, 
tableName);
+    return Objects.isNull(attributeColumns)
+        ? table.getColumnList().stream()
+            .filter(
+                columnSchema ->
+                    
columnSchema.getColumnCategory().equals(TsTableColumnCategory.TAG)
+                        || 
columnSchema.getColumnCategory().equals(TsTableColumnCategory.ATTRIBUTE))
+            .map(
+                columnSchema ->
+                    new ColumnHeader(columnSchema.getColumnName(), 
columnSchema.getDataType()))
+            .collect(Collectors.toList())
+        : Stream.concat(
+                table.getColumnList().stream()
+                    .filter(
+                        columnSchema ->
+                            
columnSchema.getColumnCategory().equals(TsTableColumnCategory.TAG)),
+                attributeColumns.stream().map(table::getColumnSchema))
+            .map(
+                columnSchema ->
+                    new ColumnHeader(columnSchema.getColumnName(), 
columnSchema.getDataType()))
+            .collect(Collectors.toList());
   }
 
   public abstract DatasetHeader getDataSetHeader();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AbstractTraverseDevice.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AbstractTraverseDevice.java
index 456b507e59f..11052e38583 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AbstractTraverseDevice.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AbstractTraverseDevice.java
@@ -73,6 +73,9 @@ public abstract class AbstractTraverseDevice extends 
Statement {
   // to help reuse filter operator
   protected List<ColumnHeader> columnHeaderList;
 
+  // If there are no attribute columns, we can skip returning it to save time
+  private List<String> attributeColumns;
+
   // For sql-input show device usage
   protected AbstractTraverseDevice(
       final NodeLocation location, final Table table, final Expression where) {
@@ -181,12 +184,16 @@ public abstract class AbstractTraverseDevice extends 
Statement {
     this.partitionKeyList = partitionKeyList;
   }
 
+  public void setAttributeColumns(final List<String> attributeColumns) {
+    this.attributeColumns = attributeColumns;
+  }
+
   public List<ColumnHeader> getColumnHeaderList() {
     return columnHeaderList;
   }
 
   public void setColumnHeaderList() {
-    this.columnHeaderList = getDeviceColumnHeaderList(database, tableName);
+    this.columnHeaderList = getDeviceColumnHeaderList(database, tableName, 
attributeColumns);
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/DeleteDevice.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/DeleteDevice.java
index 6d3f3438f08..34cecc64e1c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/DeleteDevice.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/DeleteDevice.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.schema.column.ColumnHeader;
 import org.apache.iotdb.commons.schema.filter.SchemaFilter;
 import org.apache.iotdb.commons.schema.table.TsTable;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
 import org.apache.iotdb.db.queryengine.common.SessionInfo;
 import 
org.apache.iotdb.db.queryengine.execution.operator.schema.source.DeviceBlackListConstructor;
 import 
org.apache.iotdb.db.queryengine.execution.operator.schema.source.TableDeviceQuerySource;
@@ -142,8 +143,7 @@ public class DeleteDevice extends AbstractTraverseDevice {
   }
 
   public static DeviceBlackListConstructor constructDevicePredicateUpdater(
-      final String database,
-      final String tableName,
+      final TsTable table,
       final byte[] filterInfo,
       final BiFunction<Integer, String, Binary> attributeProvider,
       final MemSchemaRegionStatistics regionStatistics) {
@@ -155,9 +155,9 @@ public class DeleteDevice extends AbstractTraverseDevice {
     }
 
     final int size = ReadWriteIOUtils.readInt(buffer);
-    final List<ColumnHeader> columnHeaderList = new ArrayList<>(size);
+    final List<TsTableColumnSchema> columnSchemaList = new ArrayList<>(size);
     for (int i = 0; i < size; i++) {
-      columnHeaderList.add(ColumnHeader.deserialize(buffer));
+      
columnSchemaList.add(table.getColumnSchema(ColumnHeader.deserialize(buffer).getColumnName()));
     }
 
     SessionInfo sessionInfo = null;
@@ -167,7 +167,7 @@ public class DeleteDevice extends AbstractTraverseDevice {
 
     final AtomicInteger valueColumnIndex = new AtomicInteger(0);
     final Map<Symbol, List<InputLocation>> inputLocations =
-        columnHeaderList.stream()
+        columnSchemaList.stream()
             .collect(
                 Collectors.toMap(
                     columnHeader -> new Symbol(columnHeader.getColumnName()),
@@ -177,11 +177,11 @@ public class DeleteDevice extends AbstractTraverseDevice {
 
     final TypeProvider mockTypeProvider =
         new TypeProvider(
-            columnHeaderList.stream()
+            columnSchemaList.stream()
                 .collect(
                     Collectors.toMap(
                         columnHeader -> new 
Symbol(columnHeader.getColumnName()),
-                        columnHeader -> 
TypeFactory.getType(columnHeader.getColumnType()))));
+                        columnHeader -> 
TypeFactory.getType(columnHeader.getDataType()))));
     final Metadata metadata = LocalExecutionPlanner.getInstance().metadata;
 
     // records LeafColumnTransformer of filter
@@ -212,9 +212,8 @@ public class DeleteDevice extends AbstractTraverseDevice {
     return new DeviceBlackListConstructor(
         filterLeafColumnTransformerList,
         filterOutputTransformer,
-        database,
-        tableName,
-        columnHeaderList,
+        table.getTableName(),
+        columnSchemaList,
         attributeProvider,
         regionStatistics);
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ShowDevice.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ShowDevice.java
index dbefd4b722a..cc59bb895fc 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ShowDevice.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/ShowDevice.java
@@ -20,9 +20,11 @@
 package org.apache.iotdb.db.queryengine.plan.relational.sql.ast;
 
 import org.apache.iotdb.commons.schema.column.ColumnHeader;
+import org.apache.iotdb.commons.schema.table.TsTable;
 import org.apache.iotdb.db.queryengine.common.header.DatasetHeader;
 import 
org.apache.iotdb.db.queryengine.execution.operator.schema.source.TableDeviceQuerySource;
 import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis;
+import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache;
 
 import org.apache.tsfile.read.common.block.TsBlock;
 import org.apache.tsfile.read.common.block.TsBlockBuilder;
@@ -93,12 +95,18 @@ public class ShowDevice extends 
AbstractQueryDeviceWithCache {
       endIndex = results.size();
     }
 
+    final TsTable table = DataNodeTableCache.getInstance().getTable(database, 
tableName);
     results
         .subList(startIndex, endIndex)
         .forEach(
             result ->
                 TableDeviceQuerySource.transformToTsBlockColumns(
-                    result, tsBlockBuilder, database, tableName, 
columnHeaderList, 1));
+                    result,
+                    tsBlockBuilder,
+                    columnHeaderList.stream()
+                        .map(columnHeader -> 
table.getColumnSchema(columnHeader.getColumnName()))
+                        .collect(Collectors.toList()),
+                    1));
     return tsBlockBuilder.build();
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
index 944954860dc..8eb8d2e0a7f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/impl/SchemaRegionMemoryImpl.java
@@ -27,9 +27,10 @@ import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.path.PathPatternTree;
 import org.apache.iotdb.commons.schema.SchemaConstant;
-import org.apache.iotdb.commons.schema.column.ColumnHeader;
 import org.apache.iotdb.commons.schema.filter.SchemaFilterType;
 import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
+import org.apache.iotdb.commons.schema.table.TsTable;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
 import org.apache.iotdb.commons.schema.view.LogicalViewSchema;
 import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
 import org.apache.iotdb.commons.utils.FileUtils;
@@ -1473,18 +1474,22 @@ public class SchemaRegionMemoryImpl implements 
ISchemaRegion {
       final TableDeviceAttributeUpdateNode updateNode) {
     final String database = updateNode.getDatabase();
     final String tableName = updateNode.getTableName();
+    final TsTable table = DataNodeTableCache.getInstance().getTable(database, 
tableName);
     final Expression predicate = updateNode.getIdFuzzyPredicate();
-    final List<ColumnHeader> columnHeaderList = 
updateNode.getColumnHeaderList();
+    final List<TsTableColumnSchema> columnSchemaList =
+        updateNode.getColumnHeaderList().stream()
+            .map(columnHeader -> 
table.getColumnSchema(columnHeader.getColumnName()))
+            .collect(Collectors.toList());
     final Map<Symbol, List<InputLocation>> inputLocations =
         makeLayout(Collections.singletonList(updateNode));
     final SessionInfo sessionInfo = updateNode.getSessionInfo();
     final TypeProvider mockTypeProvider =
         new TypeProvider(
-            columnHeaderList.stream()
+            columnSchemaList.stream()
                 .collect(
                     Collectors.toMap(
-                        columnHeader -> new 
Symbol(columnHeader.getColumnName()),
-                        columnHeader -> 
TypeFactory.getType(columnHeader.getColumnType()))));
+                        columnSchema -> new 
Symbol(columnSchema.getColumnName()),
+                        columnSchema -> 
TypeFactory.getType(columnSchema.getDataType()))));
     final Metadata metadata = LocalExecutionPlanner.getInstance().metadata;
 
     // records LeafColumnTransformer of filter
@@ -1513,7 +1518,9 @@ public class SchemaRegionMemoryImpl implements 
ISchemaRegion {
             : null;
 
     final List<TSDataType> filterOutputDataTypes =
-        
columnHeaderList.stream().map(ColumnHeader::getColumnType).collect(Collectors.toList());
+        columnSchemaList.stream()
+            .map(TsTableColumnSchema::getDataType)
+            .collect(Collectors.toList());
 
     // records LeafColumnTransformer of project expressions
     final List<LeafColumnTransformer> projectLeafColumnTransformerList = new 
ArrayList<>();
@@ -1547,9 +1554,7 @@ public class SchemaRegionMemoryImpl implements 
ISchemaRegion {
         filterLeafColumnTransformerList,
         filterOutputTransformer,
         commonTransformerList,
-        database,
-        tableName,
-        columnHeaderList,
+        columnSchemaList,
         projectLeafColumnTransformerList,
         updateNode.getAssignments().stream()
             .map(
@@ -1600,8 +1605,10 @@ public class SchemaRegionMemoryImpl implements 
ISchemaRegion {
             constructTableDevicesBlackListNode.getPatternInfo());
     final DeviceBlackListConstructor constructor =
         DeleteDevice.constructDevicePredicateUpdater(
-            PathUtils.unQualifyDatabaseName(storageGroupFullPath),
-            constructTableDevicesBlackListNode.getTableName(),
+            DataNodeTableCache.getInstance()
+                .getTable(
+                    PathUtils.unQualifyDatabaseName(storageGroupFullPath),
+                    constructTableDevicesBlackListNode.getTableName()),
             constructTableDevicesBlackListNode.getFilterInfo(),
             (pointer, name) -> deviceAttributeStore.getAttributes(pointer, 
name),
             regionStatistics);


Reply via email to