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