You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2022/08/19 01:54:38 UTC

[iotdb] branch master updated: [IOTDB-4132] Fix concurrent bug caused by sharing same DatasetHeader (#7011)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 4f9db18561 [IOTDB-4132] Fix concurrent bug caused by sharing same DatasetHeader (#7011)
4f9db18561 is described below

commit 4f9db185615fe41917acc5cbb90d1bed9380a566
Author: liuminghui233 <36...@users.noreply.github.com>
AuthorDate: Fri Aug 19 09:54:33 2022 +0800

    [IOTDB-4132] Fix concurrent bug caused by sharing same DatasetHeader (#7011)
---
 .../db/mpp/common/header/ColumnHeaderConstant.java | 218 +++++++++++++++
 .../db/mpp/common/header/DatasetHeaderFactory.java | 115 ++++++++
 .../iotdb/db/mpp/common/header/HeaderConstant.java | 311 ---------------------
 .../operator/schema/DevicesCountOperator.java      |  16 +-
 .../operator/schema/DevicesSchemaScanOperator.java |  19 +-
 .../schema/LevelTimeSeriesCountOperator.java       |  15 +-
 .../schema/NodeManageMemoryMergeOperator.java      |  13 +-
 .../operator/schema/NodePathsConvertOperator.java  |  16 +-
 .../operator/schema/NodePathsCountOperator.java    |  15 +-
 .../schema/NodePathsSchemaScanOperator.java        |  14 +-
 .../schema/PathsUsingTemplateScanOperator.java     |  18 +-
 .../schema/SchemaQueryOrderByHeatOperator.java     |  21 +-
 .../operator/schema/TimeSeriesCountOperator.java   |  16 +-
 .../schema/TimeSeriesSchemaScanOperator.java       |  24 +-
 .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java  |  52 ++--
 .../execution/config/metadata/ShowClusterTask.java |  17 +-
 .../config/metadata/ShowConfigNodesTask.java       |  17 +-
 .../config/metadata/ShowDataNodesTask.java         |  17 +-
 .../config/metadata/ShowFunctionsTask.java         |  17 +-
 .../execution/config/metadata/ShowRegionTask.java  |  16 +-
 .../config/metadata/ShowStorageGroupTask.java      |  18 +-
 .../execution/config/metadata/ShowTTLTask.java     |  17 +-
 .../template/ShowNodesInSchemaTemplateTask.java    |  18 +-
 .../metadata/template/ShowPathSetTemplateTask.java |  15 +-
 .../metadata/template/ShowSchemaTemplateTask.java  |  18 +-
 .../memory/StatementMemorySourceVisitor.java       |  60 ++--
 .../iotdb/db/mpp/plan/expression/Expression.java   |   9 +-
 .../plan/node/metedata/read/DevicesCountNode.java  |   8 +-
 .../node/metedata/read/DevicesSchemaScanNode.java  |  12 +-
 .../metedata/read/LevelTimeSeriesCountNode.java    |   8 +-
 .../metedata/read/NodePathsSchemaScanNode.java     |   8 +-
 .../metedata/read/PathsUsingTemplateScanNode.java  |   8 +-
 .../metedata/read/SchemaQueryOrderByHeatNode.java  |   4 +-
 .../node/metedata/read/TimeSeriesCountNode.java    |   8 +-
 .../metedata/read/TimeSeriesSchemaScanNode.java    |  10 +-
 .../db/mpp/plan/plan/QueryLogicalPlanUtil.java     |   8 +-
 36 files changed, 725 insertions(+), 471 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/ColumnHeaderConstant.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/ColumnHeaderConstant.java
new file mode 100644
index 0000000000..b90626b6b3
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/ColumnHeaderConstant.java
@@ -0,0 +1,218 @@
+/*
+ * 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.common.header;
+
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+public class ColumnHeaderConstant {
+
+  // column names for query statement
+  public static final String COLUMN_TIME = "Time";
+  public static final String COLUMN_VALUE = "value";
+  public static final String COLUMN_DEVICE = "Device";
+
+  // column names for schema statement
+  public static final String COLUMN_STORAGE_GROUP = "storage group";
+  public static final String COLUMN_TIMESERIES = "timeseries";
+  public static final String COLUMN_TIMESERIES_ALIAS = "alias";
+  public static final String COLUMN_TIMESERIES_DATATYPE = "dataType";
+  public static final String COLUMN_TIMESERIES_ENCODING = "encoding";
+  public static final String COLUMN_TIMESERIES_COMPRESSION = "compression";
+  public static final String COLUMN_DEVICES = "devices";
+  public static final String COLUMN_TAGS = "tags";
+  public static final String COLUMN_ATTRIBUTES = "attributes";
+  public static final String COLUMN_IS_ALIGNED = "isAligned";
+  public static final String COLUMN_COUNT = "count";
+  public static final String COLUMN_TTL = "ttl";
+  public static final String COLUMN_SCHEMA_REPLICATION_FACTOR = "schema_replication_factor";
+  public static final String COLUMN_DATA_REPLICATION_FACTOR = "data_replication_factor";
+  public static final String COLUMN_TIME_PARTITION_INTERVAL = "time_partition_interval";
+  public static final String COLUMN_CHILDPATHS = "child paths";
+  public static final String COLUMN_NODETYPES = "node types";
+  public static final String COLUMN_CHILDNODES = "child nodes";
+  public static final String COLUMN_VERSION = "version";
+  public static final String COLUMN_PATHS = "paths";
+
+  // column names for count statement
+  public static final String COLUMN_COLUMN = "column";
+  public static final String COLUMN_COUNT_DEVICES = "count(devices)";
+  public static final String COLUMN_COUNT_NODES = "count(nodes)";
+  public static final String COLUMN_COUNT_TIMESERIES = "count(timeseries)";
+  public static final String COLUMN_COUNT_STORAGE_GROUP = "count(storage group)";
+
+  // column names for show cluster statement
+  public static final String COLUMN_NODE_ID = "NodeID";
+  public static final String COLUMN_NODE_TYPE = "NodeType";
+  public static final String COLUMN_STATUS = "Status";
+  public static final String COLUMN_HOST = "Host";
+  public static final String COLUMN_PORT = "Port";
+
+  // column names for show functions statement
+  public static final String COLUMN_FUNCTION_NAME = "function name";
+  public static final String COLUMN_FUNCTION_TYPE = "function type";
+  public static final String COLUMN_FUNCTION_CLASS = "class name (UDF)";
+
+  // column names for show region statement
+  public static final String COLUMN_REGION_ID = "RegionId";
+  public static final String COLUMN_TYPE = "Type";
+  public static final String COLUMN_DATANODE_ID = "DataNodeId";
+  public static final String COLUMN_SERIES_SLOTS = "Series Slots";
+  public static final String COLUMN_TIME_SLOTS = "Time Slots";
+  public static final String COLUMN_ROLE = "Role";
+
+  // column names for show datanodes
+  public static final String COLUMN_DATA_REGION_NUM = "DataRegionNum";
+  public static final String COLUMN_SCHEMA_REGION_NUM = "SchemaRegionNum";
+
+  // column names for show schema template statement
+  public static final String COLUMN_TEMPLATE_NAME = "template name";
+
+  public static final List<ColumnHeader> lastQueryColumnHeaders =
+      ImmutableList.of(
+          new ColumnHeader(COLUMN_TIMESERIES, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_VALUE, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_TIMESERIES_DATATYPE, TSDataType.TEXT));
+
+  public static final List<ColumnHeader> showTimeSeriesColumnHeaders =
+      ImmutableList.of(
+          new ColumnHeader(COLUMN_TIMESERIES, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_TIMESERIES_ALIAS, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_STORAGE_GROUP, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_TIMESERIES_DATATYPE, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_TIMESERIES_ENCODING, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_TIMESERIES_COMPRESSION, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_TAGS, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_ATTRIBUTES, TSDataType.TEXT));
+
+  public static final List<ColumnHeader> showDevicesWithSgColumnHeaders =
+      ImmutableList.of(
+          new ColumnHeader(COLUMN_DEVICES, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_STORAGE_GROUP, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_IS_ALIGNED, TSDataType.TEXT));
+
+  public static final List<ColumnHeader> showDevicesColumnHeaders =
+      ImmutableList.of(
+          new ColumnHeader(COLUMN_DEVICES, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_IS_ALIGNED, TSDataType.TEXT));
+
+  public static final List<ColumnHeader> showTTLColumnHeaders =
+      ImmutableList.of(
+          new ColumnHeader(COLUMN_STORAGE_GROUP, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_TTL, TSDataType.INT64));
+
+  public static final List<ColumnHeader> showStorageGroupColumnHeaders =
+      ImmutableList.of(
+          new ColumnHeader(COLUMN_STORAGE_GROUP, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_TTL, TSDataType.INT64),
+          new ColumnHeader(COLUMN_SCHEMA_REPLICATION_FACTOR, TSDataType.INT32),
+          new ColumnHeader(COLUMN_DATA_REPLICATION_FACTOR, TSDataType.INT32),
+          new ColumnHeader(COLUMN_TIME_PARTITION_INTERVAL, TSDataType.INT64));
+
+  public static final List<ColumnHeader> showChildPathsColumnHeaders =
+      ImmutableList.of(
+          new ColumnHeader(COLUMN_CHILDPATHS, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_NODETYPES, TSDataType.TEXT));
+
+  public static final List<ColumnHeader> showNodesInSchemaTemplateHeaders =
+      ImmutableList.of(
+          new ColumnHeader(COLUMN_CHILDNODES, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_TIMESERIES_DATATYPE, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_TIMESERIES_ENCODING, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_TIMESERIES_COMPRESSION, TSDataType.TEXT));
+
+  public static final List<ColumnHeader> showChildNodesColumnHeaders =
+      ImmutableList.of(new ColumnHeader(COLUMN_CHILDNODES, TSDataType.TEXT));
+
+  public static final List<ColumnHeader> showVersionColumnHeaders =
+      ImmutableList.of(new ColumnHeader(COLUMN_VERSION, TSDataType.TEXT));
+
+  public static final List<ColumnHeader> showPathsUsingTemplateHeaders =
+      ImmutableList.of(new ColumnHeader(COLUMN_PATHS, TSDataType.TEXT));
+
+  public static final List<ColumnHeader> showPathSetTemplateHeaders =
+      ImmutableList.of(new ColumnHeader(COLUMN_PATHS, TSDataType.TEXT));
+
+  public static final List<ColumnHeader> countDevicesColumnHeaders =
+      ImmutableList.of(new ColumnHeader(COLUMN_COUNT_DEVICES, TSDataType.INT32));
+
+  public static final List<ColumnHeader> countNodesColumnHeaders =
+      ImmutableList.of(new ColumnHeader(COLUMN_COUNT_NODES, TSDataType.INT32));
+
+  public static final List<ColumnHeader> countLevelTimeSeriesColumnHeaders =
+      ImmutableList.of(
+          new ColumnHeader(COLUMN_COLUMN, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_COUNT_TIMESERIES, TSDataType.INT32));
+
+  public static final List<ColumnHeader> countTimeSeriesColumnHeaders =
+      ImmutableList.of(new ColumnHeader(COLUMN_COUNT_TIMESERIES, TSDataType.INT32));
+
+  public static final List<ColumnHeader> countStorageGroupColumnHeaders =
+      ImmutableList.of(new ColumnHeader(COLUMN_COUNT_STORAGE_GROUP, TSDataType.INT32));
+
+  public static final List<ColumnHeader> showRegionColumnHeaders =
+      ImmutableList.of(
+          new ColumnHeader(COLUMN_REGION_ID, TSDataType.INT32),
+          new ColumnHeader(COLUMN_TYPE, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_STATUS, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_STORAGE_GROUP, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_SERIES_SLOTS, TSDataType.INT64),
+          new ColumnHeader(COLUMN_TIME_SLOTS, TSDataType.INT64),
+          new ColumnHeader(COLUMN_DATANODE_ID, TSDataType.INT32),
+          new ColumnHeader(COLUMN_HOST, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_PORT, TSDataType.INT32),
+          new ColumnHeader(COLUMN_ROLE, TSDataType.TEXT));
+
+  public static final List<ColumnHeader> showDataNodesColumnHeaders =
+      ImmutableList.of(
+          new ColumnHeader(COLUMN_NODE_ID, TSDataType.INT32),
+          new ColumnHeader(COLUMN_STATUS, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_HOST, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_PORT, TSDataType.INT32),
+          new ColumnHeader(COLUMN_DATA_REGION_NUM, TSDataType.INT32),
+          new ColumnHeader(COLUMN_SCHEMA_REGION_NUM, TSDataType.INT32));
+
+  public static final List<ColumnHeader> showConfigNodesColumnHeaders =
+      ImmutableList.of(
+          new ColumnHeader(COLUMN_NODE_ID, TSDataType.INT32),
+          new ColumnHeader(COLUMN_STATUS, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_HOST, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_PORT, TSDataType.INT32));
+
+  public static final List<ColumnHeader> showClusterColumnHeaders =
+      ImmutableList.of(
+          new ColumnHeader(COLUMN_NODE_ID, TSDataType.INT32),
+          new ColumnHeader(COLUMN_NODE_TYPE, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_STATUS, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_HOST, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_PORT, TSDataType.INT32));
+
+  public static final List<ColumnHeader> showFunctionsColumnHeaders =
+      ImmutableList.of(
+          new ColumnHeader(COLUMN_FUNCTION_NAME, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_FUNCTION_TYPE, TSDataType.TEXT),
+          new ColumnHeader(COLUMN_FUNCTION_CLASS, TSDataType.TEXT));
+
+  public static final List<ColumnHeader> showSchemaTemplateHeaders =
+      ImmutableList.of(new ColumnHeader(COLUMN_TEMPLATE_NAME, TSDataType.TEXT));
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeaderFactory.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeaderFactory.java
new file mode 100644
index 0000000000..a30b06242d
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeaderFactory.java
@@ -0,0 +1,115 @@
+/*
+ * 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.common.header;
+
+public class DatasetHeaderFactory {
+
+  public static DatasetHeader getCountStorageGroupHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.countStorageGroupColumnHeaders, true);
+  }
+
+  public static DatasetHeader getCountNodesHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.countNodesColumnHeaders, true);
+  }
+
+  public static DatasetHeader getCountDevicesHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.countDevicesColumnHeaders, true);
+  }
+
+  public static DatasetHeader getCountTimeSeriesHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.countTimeSeriesColumnHeaders, true);
+  }
+
+  public static DatasetHeader getCountLevelTimeSeriesHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.countLevelTimeSeriesColumnHeaders, true);
+  }
+
+  public static DatasetHeader getShowTimeSeriesHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showTimeSeriesColumnHeaders, true);
+  }
+
+  public static DatasetHeader getShowDevicesHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showDevicesColumnHeaders, true);
+  }
+
+  public static DatasetHeader getShowDevicesWithSgHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showDevicesWithSgColumnHeaders, true);
+  }
+
+  public static DatasetHeader getShowStorageGroupHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showStorageGroupColumnHeaders, true);
+  }
+
+  public static DatasetHeader getShowTTLHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showTTLColumnHeaders, true);
+  }
+
+  public static DatasetHeader getShowChildPathsHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showChildPathsColumnHeaders, true);
+  }
+
+  public static DatasetHeader getShowChildNodesHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showChildNodesColumnHeaders, true);
+  }
+
+  public static DatasetHeader getShowVersionHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showVersionColumnHeaders, true);
+  }
+
+  public static DatasetHeader getLastQueryHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.lastQueryColumnHeaders, false);
+  }
+
+  public static DatasetHeader getShowClusterHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showClusterColumnHeaders, true);
+  }
+
+  public static DatasetHeader getShowFunctionsHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showFunctionsColumnHeaders, true);
+  }
+
+  public static DatasetHeader getShowRegionHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showRegionColumnHeaders, true);
+  }
+
+  public static DatasetHeader getShowDataNodesHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showDataNodesColumnHeaders, true);
+  }
+
+  public static DatasetHeader getShowConfigNodesHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showConfigNodesColumnHeaders, true);
+  }
+
+  public static DatasetHeader getShowSchemaTemplateHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showSchemaTemplateHeaders, true);
+  }
+
+  public static DatasetHeader getShowNodesInSchemaTemplateHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showNodesInSchemaTemplateHeaders, true);
+  }
+
+  public static DatasetHeader getShowPathSetTemplateHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showPathSetTemplateHeaders, true);
+  }
+
+  public static DatasetHeader getShowPathsUsingTemplateHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showPathsUsingTemplateHeaders, true);
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/HeaderConstant.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/HeaderConstant.java
deleted file mode 100644
index b3ab46d8a2..0000000000
--- a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/HeaderConstant.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * 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.common.header;
-
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-
-import java.util.Arrays;
-import java.util.Collections;
-
-public class HeaderConstant {
-
-  // column names for query statement
-  public static final String COLUMN_TIME = "Time";
-  public static final String COLUMN_VALUE = "value";
-  public static final String COLUMN_DEVICE = "Device";
-
-  // column names for schema statement
-  public static final String COLUMN_STORAGE_GROUP = "storage group";
-  public static final String COLUMN_TIMESERIES = "timeseries";
-  public static final String COLUMN_TIMESERIES_ALIAS = "alias";
-  public static final String COLUMN_TIMESERIES_DATATYPE = "dataType";
-  public static final String COLUMN_TIMESERIES_ENCODING = "encoding";
-  public static final String COLUMN_TIMESERIES_COMPRESSION = "compression";
-  public static final String COLUMN_DEVICES = "devices";
-  public static final String COLUMN_TAGS = "tags";
-  public static final String COLUMN_ATTRIBUTES = "attributes";
-  public static final String COLUMN_IS_ALIGNED = "isAligned";
-  public static final String COLUMN_COUNT = "count";
-  public static final String COLUMN_TTL = "ttl";
-  public static final String COLUMN_SCHEMA_REPLICATION_FACTOR = "schema_replication_factor";
-  public static final String COLUMN_DATA_REPLICATION_FACTOR = "data_replication_factor";
-  public static final String COLUMN_TIME_PARTITION_INTERVAL = "time_partition_interval";
-  public static final String COLUMN_CHILDPATHS = "child paths";
-  public static final String COLUMN_NODETYPES = "node types";
-  public static final String COLUMN_CHILDNODES = "child nodes";
-  public static final String COLUMN_VERSION = "version";
-  public static final String COLUMN_PATHS = "paths";
-
-  // column names for count statement
-  public static final String COLUMN_COLUMN = "column";
-  public static final String COLUMN_COUNT_DEVICES = "count(devices)";
-  public static final String COLUMN_COUNT_NODES = "count(nodes)";
-  public static final String COLUMN_COUNT_TIMESERIES = "count(timeseries)";
-  public static final String COLUMN_COUNT_STORAGE_GROUP = "count(storage group)";
-
-  // column names for show cluster statement
-  public static final String COLUMN_NODE_ID = "NodeID";
-  public static final String COLUMN_NODE_TYPE = "NodeType";
-  public static final String COLUMN_STATUS = "Status";
-  public static final String COLUMN_HOST = "Host";
-  public static final String COLUMN_PORT = "Port";
-
-  // column names for show functions statement
-  public static final String COLUMN_FUNCTION_NAME = "function name";
-  public static final String COLUMN_FUNCTION_TYPE = "function type";
-  public static final String COLUMN_FUNCTION_CLASS = "class name (UDF)";
-
-  // column names for show region statement
-  public static final String COLUMN_REGION_ID = "RegionId";
-  public static final String COLUMN_TYPE = "Type";
-  public static final String COLUMN_DATANODE_ID = "DataNodeId";
-  public static final String COLUMN_SERIES_SLOTS = "Series Slots";
-  public static final String COLUMN_TIME_SLOTS = "Time Slots";
-  public static final String COLUMN_ROLE = "Role";
-
-  // column names for show datanodes
-  public static final String COLUMN_DATA_REGION_NUM = "DataRegionNum";
-  public static final String COLUMN_SCHEMA_REGION_NUM = "SchemaRegionNum";
-
-  // column names for show schema template statement
-  public static final String COLUMN_TEMPLATE_NAME = "template name";
-
-  // dataset header for schema statement
-  public static final DatasetHeader showTimeSeriesHeader;
-  public static final DatasetHeader showDevicesHeader;
-  public static final DatasetHeader showDevicesWithSgHeader;
-  public static final DatasetHeader showStorageGroupHeader;
-  public static final DatasetHeader showTTLHeader;
-  public static final DatasetHeader showChildPathsHeader;
-  public static final DatasetHeader showChildNodesHeader;
-  public static final DatasetHeader showVersionHeader;
-
-  // dataset header for count statement
-  public static final DatasetHeader countStorageGroupHeader;
-  public static final DatasetHeader countNodesHeader;
-  public static final DatasetHeader countDevicesHeader;
-  public static final DatasetHeader countTimeSeriesHeader;
-  public static final DatasetHeader countLevelTimeSeriesHeader;
-
-  // dataset header for show cluster statement
-  public static final DatasetHeader showClusterHeader;
-
-  // dataset header for last query
-  public static final DatasetHeader LAST_QUERY_HEADER;
-
-  // dataset header for show functions
-  public static final DatasetHeader SHOW_FUNCTIONS_HEADER;
-
-  // dataset header for show region
-  public static final DatasetHeader showRegionHeader;
-
-  // dataset header for show datanodes
-  public static final DatasetHeader showDataNodesHeader;
-
-  // dataset header for show nodes in schema template
-  public static final DatasetHeader showNodesInSchemaTemplate;
-
-  // dataset header for show schma template
-  public static final DatasetHeader showSchemaTemplate;
-
-  // dataset header for show path set template
-  public static final DatasetHeader showPathSetTemplate;
-
-  // dataset header for show paths using template
-  public static final DatasetHeader showPathsUsingTemplate;
-
-  // dataset header for show confignodes
-  public static final DatasetHeader showConfigNodesHeader;
-
-  static {
-    countStorageGroupHeader =
-        new DatasetHeader(
-            Collections.singletonList(
-                new ColumnHeader(COLUMN_COUNT_STORAGE_GROUP, TSDataType.INT32)),
-            true);
-    countNodesHeader =
-        new DatasetHeader(
-            Collections.singletonList(new ColumnHeader(COLUMN_COUNT_NODES, TSDataType.INT32)),
-            true);
-    countDevicesHeader =
-        new DatasetHeader(
-            Collections.singletonList(new ColumnHeader(COLUMN_COUNT_DEVICES, TSDataType.INT32)),
-            true);
-    countTimeSeriesHeader =
-        new DatasetHeader(
-            Collections.singletonList(new ColumnHeader(COLUMN_COUNT_TIMESERIES, TSDataType.INT32)),
-            true);
-    countLevelTimeSeriesHeader =
-        new DatasetHeader(
-            Arrays.asList(
-                new ColumnHeader(COLUMN_COLUMN, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_COUNT_TIMESERIES, TSDataType.INT32)),
-            true);
-  }
-
-  static {
-    showTimeSeriesHeader =
-        new DatasetHeader(
-            Arrays.asList(
-                new ColumnHeader(COLUMN_TIMESERIES, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_TIMESERIES_ALIAS, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_STORAGE_GROUP, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_TIMESERIES_DATATYPE, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_TIMESERIES_ENCODING, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_TIMESERIES_COMPRESSION, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_TAGS, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_ATTRIBUTES, TSDataType.TEXT)),
-            true);
-    showDevicesHeader =
-        new DatasetHeader(
-            Arrays.asList(
-                new ColumnHeader(COLUMN_DEVICES, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_IS_ALIGNED, TSDataType.TEXT)),
-            true);
-    showDevicesWithSgHeader =
-        new DatasetHeader(
-            Arrays.asList(
-                new ColumnHeader(COLUMN_DEVICES, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_STORAGE_GROUP, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_IS_ALIGNED, TSDataType.TEXT)),
-            true);
-    showStorageGroupHeader =
-        new DatasetHeader(
-            Arrays.asList(
-                new ColumnHeader(COLUMN_STORAGE_GROUP, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_TTL, TSDataType.INT64),
-                new ColumnHeader(COLUMN_SCHEMA_REPLICATION_FACTOR, TSDataType.INT32),
-                new ColumnHeader(COLUMN_DATA_REPLICATION_FACTOR, TSDataType.INT32),
-                new ColumnHeader(COLUMN_TIME_PARTITION_INTERVAL, TSDataType.INT64)),
-            true);
-    showTTLHeader =
-        new DatasetHeader(
-            Arrays.asList(
-                new ColumnHeader(COLUMN_STORAGE_GROUP, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_TTL, TSDataType.INT64)),
-            true);
-    showChildPathsHeader =
-        new DatasetHeader(
-            Arrays.asList(
-                new ColumnHeader(COLUMN_CHILDPATHS, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_NODETYPES, TSDataType.TEXT)),
-            true);
-    showChildNodesHeader =
-        new DatasetHeader(
-            Collections.singletonList(new ColumnHeader(COLUMN_CHILDNODES, TSDataType.TEXT)), true);
-    showVersionHeader =
-        new DatasetHeader(
-            Collections.singletonList(new ColumnHeader(COLUMN_VERSION, TSDataType.TEXT)), true);
-  }
-
-  static {
-    LAST_QUERY_HEADER =
-        new DatasetHeader(
-            Arrays.asList(
-                new ColumnHeader(COLUMN_TIMESERIES, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_VALUE, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_TIMESERIES_DATATYPE, TSDataType.TEXT)),
-            false);
-  }
-
-  static {
-    showClusterHeader =
-        new DatasetHeader(
-            Arrays.asList(
-                new ColumnHeader(COLUMN_NODE_ID, TSDataType.INT32),
-                new ColumnHeader(COLUMN_NODE_TYPE, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_STATUS, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_HOST, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_PORT, TSDataType.INT32)),
-            true);
-  }
-
-  static {
-    SHOW_FUNCTIONS_HEADER =
-        new DatasetHeader(
-            Arrays.asList(
-                new ColumnHeader(COLUMN_FUNCTION_NAME, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_FUNCTION_TYPE, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_FUNCTION_CLASS, TSDataType.TEXT)),
-            true);
-  }
-
-  static {
-    showRegionHeader =
-        new DatasetHeader(
-            Arrays.asList(
-                new ColumnHeader(COLUMN_REGION_ID, TSDataType.INT32),
-                new ColumnHeader(COLUMN_TYPE, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_STATUS, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_STORAGE_GROUP, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_SERIES_SLOTS, TSDataType.INT64),
-                new ColumnHeader(COLUMN_TIME_SLOTS, TSDataType.INT64),
-                new ColumnHeader(COLUMN_DATANODE_ID, TSDataType.INT32),
-                new ColumnHeader(COLUMN_HOST, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_PORT, TSDataType.INT32),
-                new ColumnHeader(COLUMN_ROLE, TSDataType.TEXT)),
-            true);
-  }
-
-  static {
-    showDataNodesHeader =
-        new DatasetHeader(
-            Arrays.asList(
-                new ColumnHeader(COLUMN_NODE_ID, TSDataType.INT32),
-                new ColumnHeader(COLUMN_STATUS, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_HOST, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_PORT, TSDataType.INT32),
-                new ColumnHeader(COLUMN_DATA_REGION_NUM, TSDataType.INT32),
-                new ColumnHeader(COLUMN_SCHEMA_REGION_NUM, TSDataType.INT32)),
-            true);
-  }
-
-  static {
-    showConfigNodesHeader =
-        new DatasetHeader(
-            Arrays.asList(
-                new ColumnHeader(COLUMN_NODE_ID, TSDataType.INT32),
-                new ColumnHeader(COLUMN_STATUS, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_HOST, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_PORT, TSDataType.INT32)),
-            true);
-  }
-
-  static {
-    showSchemaTemplate =
-        new DatasetHeader(
-            Collections.singletonList(new ColumnHeader(COLUMN_TEMPLATE_NAME, TSDataType.TEXT)),
-            true);
-    showNodesInSchemaTemplate =
-        new DatasetHeader(
-            Arrays.asList(
-                new ColumnHeader(COLUMN_CHILDNODES, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_TIMESERIES_DATATYPE, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_TIMESERIES_ENCODING, TSDataType.TEXT),
-                new ColumnHeader(COLUMN_TIMESERIES_COMPRESSION, TSDataType.TEXT)),
-            true);
-    showPathSetTemplate =
-        new DatasetHeader(
-            Collections.singletonList(new ColumnHeader(COLUMN_PATHS, TSDataType.TEXT)), true);
-    showPathsUsingTemplate =
-        new DatasetHeader(
-            Collections.singletonList(new ColumnHeader(COLUMN_PATHS, TSDataType.TEXT)), true);
-  }
-}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/DevicesCountOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/DevicesCountOperator.java
index 28c6cd268e..ca69fef36f 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/DevicesCountOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/DevicesCountOperator.java
@@ -21,14 +21,19 @@ package org.apache.iotdb.db.mpp.execution.operator.schema;
 
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.execution.driver.SchemaDriverContext;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
 import org.apache.iotdb.db.mpp.execution.operator.source.SourceOperator;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlock;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 public class DevicesCountOperator implements SourceOperator {
   private final PlanNodeId sourceId;
   private final OperatorContext operatorContext;
@@ -37,6 +42,8 @@ public class DevicesCountOperator implements SourceOperator {
 
   private boolean isFinished;
 
+  private final List<TSDataType> outputDataTypes;
+
   @Override
   public PlanNodeId getSourceId() {
     return sourceId;
@@ -51,6 +58,10 @@ public class DevicesCountOperator implements SourceOperator {
     this.operatorContext = operatorContext;
     this.partialPath = partialPath;
     this.isPrefixPath = isPrefixPath;
+    this.outputDataTypes =
+        ColumnHeaderConstant.countDevicesColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
   }
 
   @Override
@@ -61,8 +72,7 @@ public class DevicesCountOperator implements SourceOperator {
   @Override
   public TsBlock next() {
     isFinished = true;
-    TsBlockBuilder tsBlockBuilder =
-        new TsBlockBuilder(HeaderConstant.countDevicesHeader.getRespDataTypes());
+    TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(outputDataTypes);
     int count = 0;
     try {
       count =
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/DevicesSchemaScanOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/DevicesSchemaScanOperator.java
index 17c700f4ae..fc8a3993e5 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/DevicesSchemaScanOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/DevicesSchemaScanOperator.java
@@ -20,18 +20,24 @@ package org.apache.iotdb.db.mpp.execution.operator.schema;
 
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.execution.driver.SchemaDriverContext;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.qp.physical.sys.ShowDevicesPlan;
 import org.apache.iotdb.db.query.dataset.ShowDevicesResult;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlock;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Binary;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 public class DevicesSchemaScanOperator extends SchemaQueryScanOperator {
   private final boolean hasSgCol;
+  private final List<TSDataType> outputDataTypes;
 
   public DevicesSchemaScanOperator(
       PlanNodeId sourceId,
@@ -43,15 +49,16 @@ public class DevicesSchemaScanOperator extends SchemaQueryScanOperator {
       boolean hasSgCol) {
     super(sourceId, operatorContext, limit, offset, partialPath, isPrefixPath);
     this.hasSgCol = hasSgCol;
+    this.outputDataTypes =
+        (hasSgCol
+                ? ColumnHeaderConstant.showDevicesWithSgColumnHeaders
+                : ColumnHeaderConstant.showDevicesColumnHeaders)
+            .stream().map(ColumnHeader::getColumnType).collect(Collectors.toList());
   }
 
   @Override
   protected TsBlock createTsBlock() {
-    TsBlockBuilder builder =
-        new TsBlockBuilder(
-            hasSgCol
-                ? HeaderConstant.showDevicesWithSgHeader.getRespDataTypes()
-                : HeaderConstant.showDevicesHeader.getRespDataTypes());
+    TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
     try {
       ((SchemaDriverContext) operatorContext.getInstanceContext().getDriverContext())
           .getSchemaRegion()
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/LevelTimeSeriesCountOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/LevelTimeSeriesCountOperator.java
index 9389035065..1630af74a2 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/LevelTimeSeriesCountOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/LevelTimeSeriesCountOperator.java
@@ -21,16 +21,20 @@ package org.apache.iotdb.db.mpp.execution.operator.schema;
 
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.execution.driver.SchemaDriverContext;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
 import org.apache.iotdb.db.mpp.execution.operator.source.SourceOperator;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlock;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Binary;
 
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 public class LevelTimeSeriesCountOperator implements SourceOperator {
   private final PlanNodeId sourceId;
@@ -44,6 +48,8 @@ public class LevelTimeSeriesCountOperator implements SourceOperator {
 
   private boolean isFinished;
 
+  private final List<TSDataType> outputDataTypes;
+
   public LevelTimeSeriesCountOperator(
       PlanNodeId sourceId,
       OperatorContext operatorContext,
@@ -61,6 +67,10 @@ public class LevelTimeSeriesCountOperator implements SourceOperator {
     this.key = key;
     this.value = value;
     this.isContains = isContains;
+    this.outputDataTypes =
+        ColumnHeaderConstant.countLevelTimeSeriesColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
   }
 
   @Override
@@ -76,8 +86,7 @@ public class LevelTimeSeriesCountOperator implements SourceOperator {
   @Override
   public TsBlock next() {
     isFinished = true;
-    TsBlockBuilder tsBlockBuilder =
-        new TsBlockBuilder(HeaderConstant.countLevelTimeSeriesHeader.getRespDataTypes());
+    TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(outputDataTypes);
     Map<PartialPath, Integer> countMap;
     try {
       if (key != null && value != null) {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodeManageMemoryMergeOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodeManageMemoryMergeOperator.java
index f97f299279..a4510ed53c 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodeManageMemoryMergeOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodeManageMemoryMergeOperator.java
@@ -21,10 +21,12 @@ package org.apache.iotdb.db.mpp.execution.operator.schema;
 
 import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.db.metadata.mnode.MNodeType;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.execution.operator.Operator;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
 import org.apache.iotdb.db.mpp.execution.operator.process.ProcessOperator;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlock;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Binary;
@@ -32,6 +34,7 @@ import org.apache.iotdb.tsfile.utils.Binary;
 import com.google.common.util.concurrent.ListenableFuture;
 
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.stream.Collectors;
@@ -44,6 +47,7 @@ public class NodeManageMemoryMergeOperator implements ProcessOperator {
   private final Set<String> nameSet;
   private final Operator child;
   private boolean isReadingMemory;
+  private final List<TSDataType> outputDataTypes;
 
   public NodeManageMemoryMergeOperator(
       OperatorContext operatorContext, Set<TSchemaNode> data, Operator child) {
@@ -52,6 +56,10 @@ public class NodeManageMemoryMergeOperator implements ProcessOperator {
     nameSet = data.stream().map(schemaNode -> schemaNode.getNodeName()).collect(Collectors.toSet());
     this.child = requireNonNull(child, "child operator is null");
     isReadingMemory = true;
+    this.outputDataTypes =
+        ColumnHeaderConstant.showChildPathsColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
   }
 
   @Override
@@ -91,8 +99,7 @@ public class NodeManageMemoryMergeOperator implements ProcessOperator {
   }
 
   private TsBlock transferToTsBlock(Set<TSchemaNode> nodePaths) {
-    TsBlockBuilder tsBlockBuilder =
-        new TsBlockBuilder(HeaderConstant.showChildPathsHeader.getRespDataTypes());
+    TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(outputDataTypes);
     // sort by node type
     Set<TSchemaNode> sortSet =
         new TreeSet<>(
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodePathsConvertOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodePathsConvertOperator.java
index 2af62ce754..76ec17b585 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodePathsConvertOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodePathsConvertOperator.java
@@ -21,10 +21,12 @@ package org.apache.iotdb.db.mpp.execution.operator.schema;
 
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.execution.operator.Operator;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
 import org.apache.iotdb.db.mpp.execution.operator.process.ProcessOperator;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlock;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Binary;
@@ -33,6 +35,9 @@ import com.google.common.util.concurrent.ListenableFuture;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 import static java.util.Objects.requireNonNull;
 
 public class NodePathsConvertOperator implements ProcessOperator {
@@ -42,9 +47,15 @@ public class NodePathsConvertOperator implements ProcessOperator {
   private final OperatorContext operatorContext;
   private final Operator child;
 
+  private final List<TSDataType> outputDataTypes;
+
   public NodePathsConvertOperator(OperatorContext operatorContext, Operator child) {
     this.operatorContext = requireNonNull(operatorContext, "operatorContext is null");
     this.child = requireNonNull(child, "child operator is null");
+    this.outputDataTypes =
+        ColumnHeaderConstant.showChildPathsColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
   }
 
   @Override
@@ -63,8 +74,7 @@ public class NodePathsConvertOperator implements ProcessOperator {
     if (block == null || block.isEmpty()) {
       return null;
     }
-    TsBlockBuilder tsBlockBuilder =
-        new TsBlockBuilder(HeaderConstant.showChildNodesHeader.getRespDataTypes());
+    TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(outputDataTypes);
 
     for (int i = 0; i < block.getPositionCount(); i++) {
       String path = block.getColumn(0).getBinary(i).toString();
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodePathsCountOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodePathsCountOperator.java
index 98df95be4a..79b3af2c41 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodePathsCountOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodePathsCountOperator.java
@@ -19,17 +19,21 @@
 
 package org.apache.iotdb.db.mpp.execution.operator.schema;
 
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.execution.operator.Operator;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
 import org.apache.iotdb.db.mpp.execution.operator.process.ProcessOperator;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlock;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import static java.util.Objects.requireNonNull;
 
@@ -40,11 +44,17 @@ public class NodePathsCountOperator implements ProcessOperator {
   private boolean isFinished;
   private final Set<String> nodePaths;
 
+  private final List<TSDataType> outputDataTypes;
+
   public NodePathsCountOperator(OperatorContext operatorContext, Operator child) {
     this.operatorContext = requireNonNull(operatorContext, "operatorContext is null");
     this.child = requireNonNull(child, "child operator is null");
     this.isFinished = false;
     this.nodePaths = new HashSet<>();
+    this.outputDataTypes =
+        ColumnHeaderConstant.countNodesColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
   }
 
   @Override
@@ -55,8 +65,7 @@ public class NodePathsCountOperator implements ProcessOperator {
   @Override
   public TsBlock next() {
     isFinished = true;
-    TsBlockBuilder tsBlockBuilder =
-        new TsBlockBuilder(HeaderConstant.countNodesHeader.getRespDataTypes());
+    TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(outputDataTypes);
 
     tsBlockBuilder.getTimeColumnBuilder().writeLong(0L);
     tsBlockBuilder.getColumnBuilder(0).writeInt(nodePaths.size());
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodePathsSchemaScanOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodePathsSchemaScanOperator.java
index 2db64f704c..1daade8dc3 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodePathsSchemaScanOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/NodePathsSchemaScanOperator.java
@@ -23,15 +23,18 @@ import org.apache.iotdb.common.rpc.thrift.TSchemaNode;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.metadata.mnode.MNodeType;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.execution.driver.SchemaDriverContext;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
 import org.apache.iotdb.db.mpp.execution.operator.source.SourceOperator;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlock;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Binary;
 
+import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -46,12 +49,18 @@ public class NodePathsSchemaScanOperator implements SourceOperator {
 
   private boolean isFinished;
 
+  private final List<TSDataType> outputDataTypes;
+
   public NodePathsSchemaScanOperator(
       PlanNodeId sourceId, OperatorContext operatorContext, PartialPath partialPath, int level) {
     this.sourceId = sourceId;
     this.operatorContext = operatorContext;
     this.partialPath = partialPath;
     this.level = level;
+    this.outputDataTypes =
+        ColumnHeaderConstant.showChildPathsColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
   }
 
   @Override
@@ -62,8 +71,7 @@ public class NodePathsSchemaScanOperator implements SourceOperator {
   @Override
   public TsBlock next() {
     isFinished = true;
-    TsBlockBuilder tsBlockBuilder =
-        new TsBlockBuilder(HeaderConstant.showChildPathsHeader.getRespDataTypes());
+    TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(outputDataTypes);
     try {
       if (-1 == level) {
         // show child paths and show child nodes
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/PathsUsingTemplateScanOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/PathsUsingTemplateScanOperator.java
index bb4c58b445..b65dade6de 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/PathsUsingTemplateScanOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/PathsUsingTemplateScanOperator.java
@@ -20,28 +20,38 @@
 package org.apache.iotdb.db.mpp.execution.operator.schema;
 
 import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.execution.driver.SchemaDriverContext;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlock;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Binary;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 public class PathsUsingTemplateScanOperator extends SchemaQueryScanOperator {
 
-  private int templateId;
+  private final int templateId;
+
+  private final List<TSDataType> outputDataTypes;
 
   public PathsUsingTemplateScanOperator(
       PlanNodeId planNodeId, OperatorContext context, int templateId) {
     super(planNodeId, context, 0, 0, null, false);
     this.templateId = templateId;
+    this.outputDataTypes =
+        ColumnHeaderConstant.showPathsUsingTemplateHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
   }
 
   @Override
   protected TsBlock createTsBlock() {
-    TsBlockBuilder builder =
-        new TsBlockBuilder(HeaderConstant.showPathsUsingTemplate.getRespDataTypes());
+    TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
     try {
       ((SchemaDriverContext) operatorContext.getInstanceContext().getDriverContext())
           .getSchemaRegion()
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaQueryOrderByHeatOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaQueryOrderByHeatOperator.java
index 5b65e10cc8..f52cbf62a4 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaQueryOrderByHeatOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaQueryOrderByHeatOperator.java
@@ -19,10 +19,12 @@
 
 package org.apache.iotdb.db.mpp.execution.operator.schema;
 
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.execution.operator.Operator;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
 import org.apache.iotdb.db.mpp.execution.operator.process.ProcessOperator;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlock;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Binary;
@@ -34,6 +36,7 @@ import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import static java.util.Objects.requireNonNull;
 
@@ -45,6 +48,9 @@ public class SchemaQueryOrderByHeatOperator implements ProcessOperator {
   private final List<TsBlock> showTimeSeriesResult;
   private final List<TsBlock> lastQueryResult;
 
+  private final List<TSDataType> outputDataTypes;
+  private final int columnCount;
+
   private int currentIndex;
 
   public SchemaQueryOrderByHeatOperator(OperatorContext operatorContext, List<Operator> operators) {
@@ -52,6 +58,11 @@ public class SchemaQueryOrderByHeatOperator implements ProcessOperator {
     this.operators = operators;
     this.showTimeSeriesResult = new ArrayList<>();
     this.lastQueryResult = new ArrayList<>();
+    this.outputDataTypes =
+        ColumnHeaderConstant.showTimeSeriesColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    this.columnCount = outputDataTypes.size();
 
     currentIndex = 0;
   }
@@ -60,8 +71,7 @@ public class SchemaQueryOrderByHeatOperator implements ProcessOperator {
   public TsBlock next() {
     isFinished = true;
 
-    TsBlockBuilder tsBlockBuilder =
-        new TsBlockBuilder(HeaderConstant.showTimeSeriesHeader.getRespDataTypes());
+    TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(outputDataTypes);
 
     // Step 1: get last point result
     Map<String, Long> timeseriesToLastTimestamp = new HashMap<>();
@@ -97,7 +107,7 @@ public class SchemaQueryOrderByHeatOperator implements ProcessOperator {
       List<Object[]> rows = lastTimestampToTsSchema.get(time);
       for (Object[] row : rows) {
         tsBlockBuilder.getTimeColumnBuilder().writeLong(0L);
-        for (int i = 0; i < HeaderConstant.showTimeSeriesHeader.getRespDataTypes().size(); i++) {
+        for (int i = 0; i < columnCount; i++) {
           Object value = row[i];
           if (null == value) {
             tsBlockBuilder.getColumnBuilder(i).appendNull();
@@ -157,8 +167,7 @@ public class SchemaQueryOrderByHeatOperator implements ProcessOperator {
   }
 
   private boolean isShowTimeSeriesBlock(TsBlock tsBlock) {
-    return tsBlock.getValueColumnCount()
-        == HeaderConstant.showTimeSeriesHeader.getOutputValueColumnCount();
+    return tsBlock.getValueColumnCount() == columnCount;
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/TimeSeriesCountOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/TimeSeriesCountOperator.java
index 0fac3e052a..c87f2ee765 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/TimeSeriesCountOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/TimeSeriesCountOperator.java
@@ -21,14 +21,19 @@ package org.apache.iotdb.db.mpp.execution.operator.schema;
 
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.execution.driver.SchemaDriverContext;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
 import org.apache.iotdb.db.mpp.execution.operator.source.SourceOperator;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlock;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 public class TimeSeriesCountOperator implements SourceOperator {
   private final PlanNodeId sourceId;
   private final OperatorContext operatorContext;
@@ -40,6 +45,8 @@ public class TimeSeriesCountOperator implements SourceOperator {
 
   private boolean isFinished;
 
+  private final List<TSDataType> outputDataTypes;
+
   @Override
   public PlanNodeId getSourceId() {
     return sourceId;
@@ -60,6 +67,10 @@ public class TimeSeriesCountOperator implements SourceOperator {
     this.key = key;
     this.value = value;
     this.isContains = isContains;
+    this.outputDataTypes =
+        ColumnHeaderConstant.countTimeSeriesColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
   }
 
   @Override
@@ -70,8 +81,7 @@ public class TimeSeriesCountOperator implements SourceOperator {
   @Override
   public TsBlock next() {
     isFinished = true;
-    TsBlockBuilder tsBlockBuilder =
-        new TsBlockBuilder(HeaderConstant.countTimeSeriesHeader.getRespDataTypes());
+    TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(outputDataTypes);
     int count = 0;
     try {
       if (key != null && value != null) {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/TimeSeriesSchemaScanOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/TimeSeriesSchemaScanOperator.java
index 0580200fe5..ab8a49e1b8 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/TimeSeriesSchemaScanOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/TimeSeriesSchemaScanOperator.java
@@ -21,27 +21,32 @@ package org.apache.iotdb.db.mpp.execution.operator.schema;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.metadata.template.Template;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.execution.driver.SchemaDriverContext;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.qp.physical.sys.ShowTimeSeriesPlan;
 import org.apache.iotdb.db.query.dataset.ShowTimeSeriesResult;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlock;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 
+import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
 public class TimeSeriesSchemaScanOperator extends SchemaQueryScanOperator {
-  private String key;
-  private String value;
-  private boolean isContains;
+  private final String key;
+  private final String value;
+  private final boolean isContains;
 
   // if is true, the result will be sorted according to the inserting frequency of the timeseries
-  private boolean orderByHeat;
+  private final boolean orderByHeat;
 
-  private Map<Integer, Template> templateMap;
+  private final Map<Integer, Template> templateMap;
+
+  private final List<TSDataType> outputDataTypes;
 
   public TimeSeriesSchemaScanOperator(
       PlanNodeId planNodeId,
@@ -61,6 +66,10 @@ public class TimeSeriesSchemaScanOperator extends SchemaQueryScanOperator {
     this.value = value;
     this.orderByHeat = orderByHeat;
     this.templateMap = templateMap;
+    this.outputDataTypes =
+        ColumnHeaderConstant.showTimeSeriesColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
   }
 
   public String getKey() {
@@ -81,8 +90,7 @@ public class TimeSeriesSchemaScanOperator extends SchemaQueryScanOperator {
 
   @Override
   protected TsBlock createTsBlock() {
-    TsBlockBuilder builder =
-        new TsBlockBuilder(HeaderConstant.showTimeSeriesHeader.getRespDataTypes());
+    TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
     try {
       ((SchemaDriverContext) operatorContext.getInstanceContext().getDriverContext())
           .getSchemaRegion()
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 3145724708..284201d0db 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
@@ -33,8 +33,9 @@ import org.apache.iotdb.db.metadata.path.MeasurementPath;
 import org.apache.iotdb.db.metadata.template.Template;
 import org.apache.iotdb.db.mpp.common.MPPQueryContext;
 import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeaderFactory;
 import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo;
 import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
 import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree;
@@ -934,8 +935,9 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
         queryStatement.isAggregationQuery() && !queryStatement.isGroupByTime();
     List<ColumnHeader> columnHeaders = new ArrayList<>();
     if (queryStatement.isAlignByDevice()) {
-      columnHeaders.add(new ColumnHeader(HeaderConstant.COLUMN_DEVICE, TSDataType.TEXT, null));
-      typeProvider.setType(HeaderConstant.COLUMN_DEVICE, TSDataType.TEXT);
+      columnHeaders.add(
+          new ColumnHeader(ColumnHeaderConstant.COLUMN_DEVICE, TSDataType.TEXT, null));
+      typeProvider.setType(ColumnHeaderConstant.COLUMN_DEVICE, TSDataType.TEXT);
     }
     columnHeaders.addAll(
         outputExpressions.stream()
@@ -978,10 +980,10 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
         expression -> ExpressionAnalyzer.updateTypeProvider(expression, typeProvider));
     analysis.setSourceExpressions(sourceExpressions);
 
-    analysis.setRespDatasetHeader(HeaderConstant.LAST_QUERY_HEADER);
-    typeProvider.setType(HeaderConstant.COLUMN_TIMESERIES, TSDataType.TEXT);
-    typeProvider.setType(HeaderConstant.COLUMN_VALUE, TSDataType.TEXT);
-    typeProvider.setType(HeaderConstant.COLUMN_TIMESERIES_DATATYPE, TSDataType.TEXT);
+    analysis.setRespDatasetHeader(DatasetHeaderFactory.getLastQueryHeader());
+    typeProvider.setType(ColumnHeaderConstant.COLUMN_TIMESERIES, TSDataType.TEXT);
+    typeProvider.setType(ColumnHeaderConstant.COLUMN_VALUE, TSDataType.TEXT);
+    typeProvider.setType(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE, TSDataType.TEXT);
 
     Set<String> deviceSet =
         allSelectedPath.stream().map(MeasurementPath::getDevice).collect(Collectors.toSet());
@@ -1406,7 +1408,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       analysis.setDataPartitionInfo(dataPartition);
     }
 
-    analysis.setRespDatasetHeader(HeaderConstant.showTimeSeriesHeader);
+    analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowTimeSeriesHeader());
     return analysis;
   }
 
@@ -1415,7 +1417,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       ShowStorageGroupStatement showStorageGroupStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
     analysis.setStatement(showStorageGroupStatement);
-    analysis.setRespDatasetHeader(HeaderConstant.showStorageGroupHeader);
+    analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowStorageGroupHeader());
     return analysis;
   }
 
@@ -1423,7 +1425,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
   public Analysis visitShowTTL(ShowTTLStatement showTTLStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
     analysis.setStatement(showTTLStatement);
-    analysis.setRespDatasetHeader(HeaderConstant.showTTLHeader);
+    analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowTTLHeader());
     return analysis;
   }
 
@@ -1441,8 +1443,8 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     analysis.setSchemaPartitionInfo(schemaPartitionInfo);
     analysis.setRespDatasetHeader(
         showDevicesStatement.hasSgCol()
-            ? HeaderConstant.showDevicesWithSgHeader
-            : HeaderConstant.showDevicesHeader);
+            ? DatasetHeaderFactory.getShowDevicesWithSgHeader()
+            : DatasetHeaderFactory.getShowDevicesHeader());
     return analysis;
   }
 
@@ -1451,7 +1453,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       ShowClusterStatement showClusterStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
     analysis.setStatement(showClusterStatement);
-    analysis.setRespDatasetHeader(HeaderConstant.showClusterHeader);
+    analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowClusterHeader());
     return analysis;
   }
 
@@ -1460,7 +1462,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       CountStorageGroupStatement countStorageGroupStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
     analysis.setStatement(countStorageGroupStatement);
-    analysis.setRespDatasetHeader(HeaderConstant.countStorageGroupHeader);
+    analysis.setRespDatasetHeader(DatasetHeaderFactory.getCountStorageGroupHeader());
     return analysis;
   }
 
@@ -1493,7 +1495,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     SchemaPartition schemaPartitionInfo = partitionFetcher.getSchemaPartition(patternTree);
 
     analysis.setSchemaPartitionInfo(schemaPartitionInfo);
-    analysis.setRespDatasetHeader(HeaderConstant.countDevicesHeader);
+    analysis.setRespDatasetHeader(DatasetHeaderFactory.getCountDevicesHeader());
     return analysis;
   }
 
@@ -1508,7 +1510,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     SchemaPartition schemaPartitionInfo = partitionFetcher.getSchemaPartition(patternTree);
 
     analysis.setSchemaPartitionInfo(schemaPartitionInfo);
-    analysis.setRespDatasetHeader(HeaderConstant.countTimeSeriesHeader);
+    analysis.setRespDatasetHeader(DatasetHeaderFactory.getCountTimeSeriesHeader());
     return analysis;
   }
 
@@ -1523,7 +1525,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     SchemaPartition schemaPartitionInfo = partitionFetcher.getSchemaPartition(patternTree);
 
     analysis.setSchemaPartitionInfo(schemaPartitionInfo);
-    analysis.setRespDatasetHeader(HeaderConstant.countLevelTimeSeriesHeader);
+    analysis.setRespDatasetHeader(DatasetHeaderFactory.getCountLevelTimeSeriesHeader());
     return analysis;
   }
 
@@ -1547,7 +1549,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     }
     analysis.setMatchedNodes(schemaNodeManagementPartition.getMatchedNode());
     analysis.setSchemaPartitionInfo(schemaNodeManagementPartition.getSchemaPartition());
-    analysis.setRespDatasetHeader(HeaderConstant.countNodesHeader);
+    analysis.setRespDatasetHeader(DatasetHeaderFactory.getCountNodesHeader());
     return analysis;
   }
 
@@ -1557,7 +1559,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     return visitSchemaNodeManagementPartition(
         showChildPathsStatement,
         showChildPathsStatement.getPartialPath(),
-        HeaderConstant.showChildPathsHeader);
+        DatasetHeaderFactory.getShowChildPathsHeader());
   }
 
   @Override
@@ -1566,7 +1568,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     return visitSchemaNodeManagementPartition(
         showChildNodesStatement,
         showChildNodesStatement.getPartialPath(),
-        HeaderConstant.showChildNodesHeader);
+        DatasetHeaderFactory.getShowChildNodesHeader());
   }
 
   @Override
@@ -1574,7 +1576,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       ShowVersionStatement showVersionStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
     analysis.setStatement(showVersionStatement);
-    analysis.setRespDatasetHeader(HeaderConstant.showVersionHeader);
+    analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowVersionHeader());
     analysis.setFinishQueryAfterAnalyze(true);
     return analysis;
   }
@@ -1666,7 +1668,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       MPPQueryContext context) {
     Analysis analysis = new Analysis();
     analysis.setStatement(showNodesInSchemaTemplateStatement);
-    analysis.setRespDatasetHeader(HeaderConstant.showNodesInSchemaTemplate);
+    analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowNodesInSchemaTemplateHeader());
     return analysis;
   }
 
@@ -1675,7 +1677,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       ShowSchemaTemplateStatement showSchemaTemplateStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
     analysis.setStatement(showSchemaTemplateStatement);
-    analysis.setRespDatasetHeader(HeaderConstant.showSchemaTemplate);
+    analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowSchemaTemplateHeader());
     return analysis;
   }
 
@@ -1720,7 +1722,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       ShowPathSetTemplateStatement showPathSetTemplateStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
     analysis.setStatement(showPathSetTemplateStatement);
-    analysis.setRespDatasetHeader(HeaderConstant.showPathSetTemplate);
+    analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowPathSetTemplateHeader());
     return analysis;
   }
 
@@ -1757,7 +1759,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       ShowPathsUsingTemplateStatement showPathsUsingTemplateStatement, MPPQueryContext context) {
     Analysis analysis = new Analysis();
     analysis.setStatement(showPathsUsingTemplateStatement);
-    analysis.setRespDatasetHeader(HeaderConstant.showPathsUsingTemplate);
+    analysis.setRespDatasetHeader(DatasetHeaderFactory.getShowPathsUsingTemplateHeader());
 
     Pair<Template, List<PartialPath>> templateSetInfo =
         schemaFetcher.getAllPathsSetTemplate(showPathsUsingTemplateStatement.getTemplateName());
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowClusterTask.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowClusterTask.java
index 257e3d824b..50b6d3fa85 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowClusterTask.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowClusterTask.java
@@ -20,19 +20,25 @@
 package org.apache.iotdb.db.mpp.plan.execution.config.metadata;
 
 import org.apache.iotdb.confignode.rpc.thrift.TShowClusterResp;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeaderFactory;
 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 org.apache.iotdb.db.mpp.plan.statement.metadata.ShowClusterStatement;
 import org.apache.iotdb.rpc.TSStatusCode;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Binary;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 import static org.apache.iotdb.commons.conf.IoTDBConstant.NODE_TYPE_CONFIG_NODE;
 import static org.apache.iotdb.commons.conf.IoTDBConstant.NODE_TYPE_DATA_NODE;
 
@@ -64,8 +70,11 @@ public class ShowClusterTask implements IConfigTask {
 
   public static void buildTSBlock(
       TShowClusterResp clusterNodeInfos, SettableFuture<ConfigTaskResult> future) {
-    TsBlockBuilder builder =
-        new TsBlockBuilder(HeaderConstant.showClusterHeader.getRespDataTypes());
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.showClusterColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
 
     clusterNodeInfos
         .getConfigNodeList()
@@ -91,7 +100,7 @@ public class ShowClusterTask implements IConfigTask {
                     e.getInternalEndPoint().getIp(),
                     e.getInternalEndPoint().getPort()));
 
-    DatasetHeader datasetHeader = HeaderConstant.showClusterHeader;
+    DatasetHeader datasetHeader = DatasetHeaderFactory.getShowClusterHeader();
     future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS, builder.build(), datasetHeader));
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowConfigNodesTask.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowConfigNodesTask.java
index ad82988420..6d47e3a605 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowConfigNodesTask.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowConfigNodesTask.java
@@ -21,19 +21,25 @@ package org.apache.iotdb.db.mpp.plan.execution.config.metadata;
 
 import org.apache.iotdb.confignode.rpc.thrift.TConfigNodeInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TShowConfigNodesResp;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeaderFactory;
 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 org.apache.iotdb.db.mpp.plan.statement.metadata.ShowConfigNodesStatement;
 import org.apache.iotdb.rpc.TSStatusCode;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Binary;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 public class ShowConfigNodesTask implements IConfigTask {
 
   private ShowConfigNodesStatement showConfigNodesStatement;
@@ -52,8 +58,11 @@ public class ShowConfigNodesTask implements IConfigTask {
 
   public static void buildTSBlock(
       TShowConfigNodesResp showConfigNodesResp, SettableFuture<ConfigTaskResult> future) {
-    TsBlockBuilder builder =
-        new TsBlockBuilder(HeaderConstant.showConfigNodesHeader.getRespDataTypes());
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.showConfigNodesColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
     if (showConfigNodesResp.getConfigNodesInfoList() != null) {
       for (TConfigNodeInfo configNodeInfo : showConfigNodesResp.getConfigNodesInfoList()) {
         builder.getTimeColumnBuilder().writeLong(0L);
@@ -66,7 +75,7 @@ public class ShowConfigNodesTask implements IConfigTask {
         builder.declarePosition();
       }
     }
-    DatasetHeader datasetHeader = HeaderConstant.showConfigNodesHeader;
+    DatasetHeader datasetHeader = DatasetHeaderFactory.getShowConfigNodesHeader();
     future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS, builder.build(), datasetHeader));
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowDataNodesTask.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowDataNodesTask.java
index 76fc64de91..b72a5eb312 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowDataNodesTask.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowDataNodesTask.java
@@ -21,19 +21,25 @@ package org.apache.iotdb.db.mpp.plan.execution.config.metadata;
 
 import org.apache.iotdb.confignode.rpc.thrift.TDataNodeInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TShowDataNodesResp;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeaderFactory;
 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 org.apache.iotdb.db.mpp.plan.statement.metadata.ShowDataNodesStatement;
 import org.apache.iotdb.rpc.TSStatusCode;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Binary;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 public class ShowDataNodesTask implements IConfigTask {
 
   private ShowDataNodesStatement showDataNodesStatement;
@@ -52,8 +58,11 @@ public class ShowDataNodesTask implements IConfigTask {
 
   public static void buildTSBlock(
       TShowDataNodesResp showDataNodesResp, SettableFuture<ConfigTaskResult> future) {
-    TsBlockBuilder builder =
-        new TsBlockBuilder(HeaderConstant.showDataNodesHeader.getRespDataTypes());
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.showDataNodesColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
     if (showDataNodesResp.getDataNodesInfoList() != null) {
       for (TDataNodeInfo dataNodeInfo : showDataNodesResp.getDataNodesInfoList()) {
         builder.getTimeColumnBuilder().writeLong(0L);
@@ -71,7 +80,7 @@ public class ShowDataNodesTask implements IConfigTask {
         builder.declarePosition();
       }
     }
-    DatasetHeader datasetHeader = HeaderConstant.showDataNodesHeader;
+    DatasetHeader datasetHeader = DatasetHeaderFactory.getShowDataNodesHeader();
     future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS, builder.build(), datasetHeader));
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowFunctionsTask.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowFunctionsTask.java
index 714739d010..5f41aabbbf 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowFunctionsTask.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowFunctionsTask.java
@@ -23,7 +23,9 @@ import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.udf.builtin.BuiltinAggregationFunction;
 import org.apache.iotdb.commons.udf.service.UDFRegistrationInformation;
 import org.apache.iotdb.commons.udf.service.UDFRegistrationService;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeaderFactory;
 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;
@@ -42,6 +44,8 @@ import org.slf4j.LoggerFactory;
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import static org.apache.iotdb.commons.conf.IoTDBConstant.COLUMN_FUNCTION_CLASS;
 import static org.apache.iotdb.commons.conf.IoTDBConstant.COLUMN_FUNCTION_NAME;
@@ -62,8 +66,11 @@ public class ShowFunctionsTask implements IConfigTask {
     final SettableFuture<ConfigTaskResult> future = SettableFuture.create();
 
     try {
-      final TsBlockBuilder builder =
-          new TsBlockBuilder(HeaderConstant.SHOW_FUNCTIONS_HEADER.getRespDataTypes());
+      List<TSDataType> outputDataTypes =
+          ColumnHeaderConstant.showFunctionsColumnHeaders.stream()
+              .map(ColumnHeader::getColumnType)
+              .collect(Collectors.toList());
+      TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
 
       final QueryDataSet showDataSet = generateShowFunctionsListDataSet();
       while (showDataSet.hasNextWithoutConstraint()) {
@@ -78,7 +85,9 @@ public class ShowFunctionsTask implements IConfigTask {
 
       future.set(
           new ConfigTaskResult(
-              TSStatusCode.SUCCESS_STATUS, builder.build(), HeaderConstant.SHOW_FUNCTIONS_HEADER));
+              TSStatusCode.SUCCESS_STATUS,
+              builder.build(),
+              DatasetHeaderFactory.getShowFunctionsHeader()));
     } catch (Exception e) {
       LOGGER.error("Failed to get functions.", e);
       future.setException(e);
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowRegionTask.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowRegionTask.java
index 8b1c2459f6..0c16fcfcd1 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowRegionTask.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowRegionTask.java
@@ -22,19 +22,25 @@ package org.apache.iotdb.db.mpp.plan.execution.config.metadata;
 import org.apache.iotdb.common.rpc.thrift.TConsensusGroupType;
 import org.apache.iotdb.confignode.rpc.thrift.TRegionInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TShowRegionResp;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeaderFactory;
 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 org.apache.iotdb.db.mpp.plan.statement.metadata.ShowRegionStatement;
 import org.apache.iotdb.rpc.TSStatusCode;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Binary;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 public class ShowRegionTask implements IConfigTask {
 
   private ShowRegionStatement showRegionStatement;
@@ -53,7 +59,11 @@ public class ShowRegionTask implements IConfigTask {
 
   public static void buildTSBlock(
       TShowRegionResp showRegionResp, SettableFuture<ConfigTaskResult> future) {
-    TsBlockBuilder builder = new TsBlockBuilder(HeaderConstant.showRegionHeader.getRespDataTypes());
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.showRegionColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
     if (showRegionResp.getRegionInfoList() != null) {
       for (TRegionInfo regionInfo : showRegionResp.getRegionInfoList()) {
         builder.getTimeColumnBuilder().writeLong(0L);
@@ -83,7 +93,7 @@ public class ShowRegionTask implements IConfigTask {
         builder.declarePosition();
       }
     }
-    DatasetHeader datasetHeader = HeaderConstant.showRegionHeader;
+    DatasetHeader datasetHeader = DatasetHeaderFactory.getShowRegionHeader();
     future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS, builder.build(), datasetHeader));
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowStorageGroupTask.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowStorageGroupTask.java
index be486f3a9d..a0557c58bd 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowStorageGroupTask.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowStorageGroupTask.java
@@ -20,24 +20,29 @@
 package org.apache.iotdb.db.mpp.plan.execution.config.metadata;
 
 import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeaderFactory;
 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 org.apache.iotdb.db.mpp.plan.statement.metadata.ShowStorageGroupStatement;
 import org.apache.iotdb.rpc.TSStatusCode;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Binary;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
 
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 public class ShowStorageGroupTask implements IConfigTask {
 
-  private ShowStorageGroupStatement showStorageGroupStatement;
+  private final ShowStorageGroupStatement showStorageGroupStatement;
 
   public ShowStorageGroupTask(ShowStorageGroupStatement showStorageGroupStatement) {
     this.showStorageGroupStatement = showStorageGroupStatement;
@@ -52,8 +57,11 @@ public class ShowStorageGroupTask implements IConfigTask {
   public static void buildTSBlock(
       Map<String, TStorageGroupSchema> storageGroupSchemaMap,
       SettableFuture<ConfigTaskResult> future) {
-    TsBlockBuilder builder =
-        new TsBlockBuilder(HeaderConstant.showStorageGroupHeader.getRespDataTypes());
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.showStorageGroupColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
     for (Map.Entry<String, TStorageGroupSchema> entry : storageGroupSchemaMap.entrySet()) {
       String storageGroup = entry.getKey();
       TStorageGroupSchema storageGroupSchema = entry.getValue();
@@ -69,7 +77,7 @@ public class ShowStorageGroupTask implements IConfigTask {
       builder.getColumnBuilder(4).writeLong(storageGroupSchema.getTimePartitionInterval());
       builder.declarePosition();
     }
-    DatasetHeader datasetHeader = HeaderConstant.showStorageGroupHeader;
+    DatasetHeader datasetHeader = DatasetHeaderFactory.getShowStorageGroupHeader();
     future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS, builder.build(), datasetHeader));
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowTTLTask.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowTTLTask.java
index 3e83fb1e07..6d87d2c279 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowTTLTask.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowTTLTask.java
@@ -19,24 +19,29 @@
 
 package org.apache.iotdb.db.mpp.plan.execution.config.metadata;
 
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeaderFactory;
 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 org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTTLStatement;
 import org.apache.iotdb.rpc.TSStatusCode;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Binary;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
 
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 public class ShowTTLTask implements IConfigTask {
 
-  private ShowTTLStatement showTTLStatement;
+  private final ShowTTLStatement showTTLStatement;
 
   public ShowTTLTask(ShowTTLStatement showTTLStatement) {
     this.showTTLStatement = showTTLStatement;
@@ -50,7 +55,11 @@ public class ShowTTLTask implements IConfigTask {
 
   public static void buildTSBlock(
       Map<String, Long> storageGroupToTTL, SettableFuture<ConfigTaskResult> future) {
-    TsBlockBuilder builder = new TsBlockBuilder(HeaderConstant.showTTLHeader.getRespDataTypes());
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.showTTLColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
     for (Map.Entry<String, Long> entry : storageGroupToTTL.entrySet()) {
       builder.getTimeColumnBuilder().writeLong(0);
       builder.getColumnBuilder(0).writeBinary(new Binary(entry.getKey()));
@@ -61,7 +70,7 @@ public class ShowTTLTask implements IConfigTask {
       }
       builder.declarePosition();
     }
-    DatasetHeader datasetHeader = HeaderConstant.showTTLHeader;
+    DatasetHeader datasetHeader = DatasetHeaderFactory.getShowTTLHeader();
     future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS, builder.build(), datasetHeader));
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/template/ShowNodesInSchemaTemplateTask.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/template/ShowNodesInSchemaTemplateTask.java
index 348571163f..7a3e66a99b 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/template/ShowNodesInSchemaTemplateTask.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/template/ShowNodesInSchemaTemplateTask.java
@@ -20,13 +20,16 @@
 package org.apache.iotdb.db.mpp.plan.execution.config.metadata.template;
 
 import org.apache.iotdb.db.metadata.template.Template;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeaderFactory;
 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 org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowNodesInSchemaTemplateStatement;
 import org.apache.iotdb.rpc.TSStatusCode;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Binary;
 import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
@@ -34,7 +37,9 @@ import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
 
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 public class ShowNodesInSchemaTemplateTask implements IConfigTask {
 
@@ -52,8 +57,11 @@ public class ShowNodesInSchemaTemplateTask implements IConfigTask {
   }
 
   public static void buildTSBlock(Template template, SettableFuture<ConfigTaskResult> future) {
-    TsBlockBuilder builder =
-        new TsBlockBuilder(HeaderConstant.showNodesInSchemaTemplate.getRespDataTypes());
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.showNodesInSchemaTemplateHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
     try {
       if (template != null) {
         // template.get
@@ -73,9 +81,9 @@ public class ShowNodesInSchemaTemplateTask implements IConfigTask {
         }
       }
     } catch (Exception e) {
-
+      e.printStackTrace();
     }
-    DatasetHeader datasetHeader = HeaderConstant.showNodesInSchemaTemplate;
+    DatasetHeader datasetHeader = DatasetHeaderFactory.getShowNodesInSchemaTemplateHeader();
     future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS, builder.build(), datasetHeader));
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/template/ShowPathSetTemplateTask.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/template/ShowPathSetTemplateTask.java
index b21091b13f..c975b8c193 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/template/ShowPathSetTemplateTask.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/template/ShowPathSetTemplateTask.java
@@ -20,13 +20,16 @@
 package org.apache.iotdb.db.mpp.plan.execution.config.metadata.template;
 
 import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeaderFactory;
 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 org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
 import org.apache.iotdb.rpc.TSStatusCode;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Binary;
 
@@ -34,6 +37,7 @@ import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class ShowPathSetTemplateTask implements IConfigTask {
 
@@ -51,8 +55,11 @@ public class ShowPathSetTemplateTask implements IConfigTask {
 
   public static void buildTSBlock(
       List<PartialPath> listPath, SettableFuture<ConfigTaskResult> future) {
-    TsBlockBuilder builder =
-        new TsBlockBuilder(HeaderConstant.showPathSetTemplate.getRespDataTypes());
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.showPathSetTemplateHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
     try {
       if (listPath != null) {
         // template.get
@@ -65,7 +72,7 @@ public class ShowPathSetTemplateTask implements IConfigTask {
     } catch (Exception e) {
       e.printStackTrace();
     }
-    DatasetHeader datasetHeader = HeaderConstant.showPathSetTemplate;
+    DatasetHeader datasetHeader = DatasetHeaderFactory.getShowPathSetTemplateHeader();
     future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS, builder.build(), datasetHeader));
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/template/ShowSchemaTemplateTask.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/template/ShowSchemaTemplateTask.java
index 5d5d8e9c50..272142ca6d 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/template/ShowSchemaTemplateTask.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/template/ShowSchemaTemplateTask.java
@@ -20,13 +20,16 @@
 package org.apache.iotdb.db.mpp.plan.execution.config.metadata.template;
 
 import org.apache.iotdb.db.metadata.template.Template;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeaderFactory;
 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 org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
 import org.apache.iotdb.rpc.TSStatusCode;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Binary;
 
@@ -36,6 +39,7 @@ import com.google.common.util.concurrent.SettableFuture;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 public class ShowSchemaTemplateTask implements IConfigTask {
 
@@ -53,17 +57,21 @@ public class ShowSchemaTemplateTask implements IConfigTask {
 
   public static void buildTSBlock(
       List<Template> templateList, SettableFuture<ConfigTaskResult> future) {
-    TsBlockBuilder builder =
-        new TsBlockBuilder(HeaderConstant.showSchemaTemplate.getRespDataTypes());
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.showSchemaTemplateHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
     Optional<List<Template>> optional = Optional.ofNullable(templateList);
-    optional.orElse(new ArrayList<>()).stream()
+    optional
+        .orElse(new ArrayList<>())
         .forEach(
             template -> {
               builder.getTimeColumnBuilder().writeLong(0L);
               builder.getColumnBuilder(0).writeBinary(new Binary(template.getName()));
               builder.declarePosition();
             });
-    DatasetHeader datasetHeader = HeaderConstant.showSchemaTemplate;
+    DatasetHeader datasetHeader = DatasetHeaderFactory.getShowSchemaTemplateHeader();
     future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS, builder.build(), datasetHeader));
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/memory/StatementMemorySourceVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/memory/StatementMemorySourceVisitor.java
index ced65edd67..41d291533b 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/memory/StatementMemorySourceVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/memory/StatementMemorySourceVisitor.java
@@ -25,8 +25,8 @@ import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.metadata.mnode.MNodeType;
 import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
 import org.apache.iotdb.db.mpp.plan.planner.LogicalPlanner;
 import org.apache.iotdb.db.mpp.plan.planner.distribution.DistributionPlanner;
 import org.apache.iotdb.db.mpp.plan.planner.plan.LogicalQueryPlan;
@@ -97,8 +97,11 @@ public class StatementMemorySourceVisitor
   @Override
   public StatementMemorySource visitShowChildPaths(
       ShowChildPathsStatement showChildPathsStatement, StatementMemorySourceContext context) {
-    TsBlockBuilder tsBlockBuilder =
-        new TsBlockBuilder(HeaderConstant.showChildPathsHeader.getRespDataTypes());
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.showChildPathsColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(outputDataTypes);
     Set<TSchemaNode> matchedChildPaths = context.getAnalysis().getMatchedNodes();
 
     // sort by node type
@@ -128,13 +131,15 @@ public class StatementMemorySourceVisitor
   @Override
   public StatementMemorySource visitShowChildNodes(
       ShowChildNodesStatement showChildNodesStatement, StatementMemorySourceContext context) {
-    TsBlockBuilder tsBlockBuilder =
-        new TsBlockBuilder(HeaderConstant.showChildNodesHeader.getRespDataTypes());
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.showChildNodesColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(outputDataTypes);
     Set<String> matchedChildNodes =
-        new TreeSet<>(
-            context.getAnalysis().getMatchedNodes().stream()
-                .map(node -> node.getNodeName())
-                .collect(Collectors.toSet()));
+        context.getAnalysis().getMatchedNodes().stream()
+            .map(TSchemaNode::getNodeName)
+            .collect(Collectors.toCollection(TreeSet::new));
     matchedChildNodes.forEach(
         node -> {
           try {
@@ -154,8 +159,11 @@ public class StatementMemorySourceVisitor
   @Override
   public StatementMemorySource visitShowVersion(
       ShowVersionStatement showVersionStatement, StatementMemorySourceContext context) {
-    TsBlockBuilder tsBlockBuilder =
-        new TsBlockBuilder(HeaderConstant.showVersionHeader.getRespDataTypes());
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.showVersionColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(outputDataTypes);
     tsBlockBuilder.getTimeColumnBuilder().writeLong(0L);
     tsBlockBuilder.getColumnBuilder(0).writeBinary(new Binary(IoTDBConstant.VERSION));
     tsBlockBuilder.declarePosition();
@@ -166,11 +174,14 @@ public class StatementMemorySourceVisitor
   @Override
   public StatementMemorySource visitCountNodes(
       CountNodesStatement countStatement, StatementMemorySourceContext context) {
-    TsBlockBuilder tsBlockBuilder =
-        new TsBlockBuilder(HeaderConstant.countNodesHeader.getRespDataTypes());
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.countNodesColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(outputDataTypes);
     Set<String> matchedChildNodes =
         context.getAnalysis().getMatchedNodes().stream()
-            .map(node -> node.getNodeName())
+            .map(TSchemaNode::getNodeName)
             .collect(Collectors.toSet());
     tsBlockBuilder.getTimeColumnBuilder().writeLong(0L);
     tsBlockBuilder.getColumnBuilder(0).writeInt(matchedChildNodes.size());
@@ -182,8 +193,11 @@ public class StatementMemorySourceVisitor
   @Override
   public StatementMemorySource visitCountDevices(
       CountDevicesStatement countStatement, StatementMemorySourceContext context) {
-    TsBlockBuilder tsBlockBuilder =
-        new TsBlockBuilder(HeaderConstant.countDevicesHeader.getRespDataTypes());
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.countDevicesColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(outputDataTypes);
     tsBlockBuilder.getTimeColumnBuilder().writeLong(0L);
     tsBlockBuilder.getColumnBuilder(0).writeInt(0);
     tsBlockBuilder.declarePosition();
@@ -194,8 +208,11 @@ public class StatementMemorySourceVisitor
   @Override
   public StatementMemorySource visitCountTimeSeries(
       CountTimeSeriesStatement countStatement, StatementMemorySourceContext context) {
-    TsBlockBuilder tsBlockBuilder =
-        new TsBlockBuilder(HeaderConstant.countTimeSeriesHeader.getRespDataTypes());
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.countTimeSeriesColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(outputDataTypes);
     tsBlockBuilder.getTimeColumnBuilder().writeLong(0L);
     tsBlockBuilder.getColumnBuilder(0).writeInt(0);
     tsBlockBuilder.declarePosition();
@@ -207,8 +224,11 @@ public class StatementMemorySourceVisitor
   public StatementMemorySource visitShowPathsUsingTemplate(
       ShowPathsUsingTemplateStatement showPathsUsingTemplateStatement,
       StatementMemorySourceContext context) {
-    TsBlockBuilder tsBlockBuilder =
-        new TsBlockBuilder(HeaderConstant.showPathsUsingTemplate.getRespDataTypes());
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.showPathsUsingTemplateHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(outputDataTypes);
     return new StatementMemorySource(
         tsBlockBuilder.build(), context.getAnalysis().getRespDatasetHeader());
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/Expression.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/Expression.java
index 829873d941..59bb10c7b3 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/Expression.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/expression/Expression.java
@@ -71,19 +71,16 @@ import java.util.Set;
 public abstract class Expression {
 
   /////////////////////////////////////////////////////////////////////////////////////////////////
-  // Operations that Class Expression is not responsible for should be done through a visitor ////
+  // Operations that Class Expression is not responsible for should be done through a visitor
   /////////////////////////////////////////////////////////////////////////////////////////////////
 
-  /**
-   * Accessible for {@link ExpressionVisitor}, use {@link ExpressionVisitor#process(Expression)}
-   * instead.
-   */
+  /** Accessible for {@link ExpressionVisitor}, use {@link ExpressionVisitor#process} instead. */
   public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) {
     return visitor.visitExpression(this, context);
   }
 
   /////////////////////////////////////////////////////////////////////////////////////////////////
-  // Expression type inferring for execution plan generation //////////////////////////////////////
+  // Expression type inferring for execution plan generation
   /////////////////////////////////////////////////////////////////////////////////////////////////
 
   public abstract ExpressionType getExpressionType();
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/DevicesCountNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/DevicesCountNode.java
index f0161a28da..f0522fca65 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/DevicesCountNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/DevicesCountNode.java
@@ -21,7 +21,8 @@ package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.read;
 
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
@@ -31,6 +32,7 @@ import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class DevicesCountNode extends SchemaQueryScanNode {
 
@@ -45,7 +47,9 @@ public class DevicesCountNode extends SchemaQueryScanNode {
 
   @Override
   public List<String> getOutputColumnNames() {
-    return HeaderConstant.countDevicesHeader.getRespColumns();
+    return ColumnHeaderConstant.countDevicesColumnHeaders.stream()
+        .map(ColumnHeader::getColumnName)
+        .collect(Collectors.toList());
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/DevicesSchemaScanNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/DevicesSchemaScanNode.java
index 7672e61296..2dae4bd591 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/DevicesSchemaScanNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/DevicesSchemaScanNode.java
@@ -20,7 +20,8 @@ package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.read;
 
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
@@ -31,6 +32,7 @@ import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 public class DevicesSchemaScanNode extends SchemaQueryScanNode {
 
@@ -59,9 +61,13 @@ public class DevicesSchemaScanNode extends SchemaQueryScanNode {
   @Override
   public List<String> getOutputColumnNames() {
     if (hasSgCol) {
-      return HeaderConstant.showDevicesWithSgHeader.getRespColumns();
+      return ColumnHeaderConstant.showDevicesWithSgColumnHeaders.stream()
+          .map(ColumnHeader::getColumnName)
+          .collect(Collectors.toList());
     }
-    return HeaderConstant.showDevicesHeader.getRespColumns();
+    return ColumnHeaderConstant.showDevicesColumnHeaders.stream()
+        .map(ColumnHeader::getColumnName)
+        .collect(Collectors.toList());
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/LevelTimeSeriesCountNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/LevelTimeSeriesCountNode.java
index d450d765b7..2c43b6626c 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/LevelTimeSeriesCountNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/LevelTimeSeriesCountNode.java
@@ -21,7 +21,8 @@ package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.read;
 
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
@@ -32,6 +33,7 @@ import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 public class LevelTimeSeriesCountNode extends SchemaQueryScanNode {
   private final int level;
@@ -78,7 +80,9 @@ public class LevelTimeSeriesCountNode extends SchemaQueryScanNode {
 
   @Override
   public List<String> getOutputColumnNames() {
-    return HeaderConstant.countLevelTimeSeriesHeader.getRespColumns();
+    return ColumnHeaderConstant.countLevelTimeSeriesColumnHeaders.stream()
+        .map(ColumnHeader::getColumnName)
+        .collect(Collectors.toList());
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/NodePathsSchemaScanNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/NodePathsSchemaScanNode.java
index 51b22f296b..7faac2b387 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/NodePathsSchemaScanNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/NodePathsSchemaScanNode.java
@@ -21,7 +21,8 @@ package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.read;
 
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.metadata.path.PathDeserializeUtil;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
@@ -31,6 +32,7 @@ import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 public class NodePathsSchemaScanNode extends SchemaQueryScanNode {
   // the path could be a prefix path with wildcard
@@ -58,7 +60,9 @@ public class NodePathsSchemaScanNode extends SchemaQueryScanNode {
 
   @Override
   public List<String> getOutputColumnNames() {
-    return HeaderConstant.showChildPathsHeader.getRespColumns();
+    return ColumnHeaderConstant.showChildPathsColumnHeaders.stream()
+        .map(ColumnHeader::getColumnName)
+        .collect(Collectors.toList());
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/PathsUsingTemplateScanNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/PathsUsingTemplateScanNode.java
index ee005728c1..235863687c 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/PathsUsingTemplateScanNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/PathsUsingTemplateScanNode.java
@@ -19,7 +19,8 @@
 
 package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.read;
 
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
@@ -29,6 +30,7 @@ import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class PathsUsingTemplateScanNode extends SchemaQueryScanNode {
 
@@ -50,7 +52,9 @@ public class PathsUsingTemplateScanNode extends SchemaQueryScanNode {
 
   @Override
   public List<String> getOutputColumnNames() {
-    return HeaderConstant.showPathsUsingTemplate.getRespColumns();
+    return ColumnHeaderConstant.showPathsUsingTemplateHeaders.stream()
+        .map(ColumnHeader::getColumnName)
+        .collect(Collectors.toList());
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/SchemaQueryOrderByHeatNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/SchemaQueryOrderByHeatNode.java
index e72a2e3dd7..68cdf909cd 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/SchemaQueryOrderByHeatNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/SchemaQueryOrderByHeatNode.java
@@ -18,7 +18,7 @@
  */
 package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.read;
 
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
@@ -60,7 +60,7 @@ public class SchemaQueryOrderByHeatNode extends MultiChildNode {
   public List<String> getOutputColumnNames() {
     for (PlanNode child : children) {
       if (child.getOutputColumnNames().size()
-          == HeaderConstant.showTimeSeriesHeader.getOutputValueColumnCount() + 1) {
+          == ColumnHeaderConstant.showTimeSeriesColumnHeaders.size() + 1) {
         return child.getOutputColumnNames();
       }
     }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/TimeSeriesCountNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/TimeSeriesCountNode.java
index 34b5827412..429ff4beab 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/TimeSeriesCountNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/TimeSeriesCountNode.java
@@ -21,7 +21,8 @@ package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.read;
 
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
@@ -31,6 +32,7 @@ import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class TimeSeriesCountNode extends SchemaQueryScanNode {
 
@@ -70,7 +72,9 @@ public class TimeSeriesCountNode extends SchemaQueryScanNode {
 
   @Override
   public List<String> getOutputColumnNames() {
-    return HeaderConstant.countTimeSeriesHeader.getRespColumns();
+    return ColumnHeaderConstant.countTimeSeriesColumnHeaders.stream()
+        .map(ColumnHeader::getColumnName)
+        .collect(Collectors.toList());
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/TimeSeriesSchemaScanNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/TimeSeriesSchemaScanNode.java
index b6adb16773..683abeabb8 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/TimeSeriesSchemaScanNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/TimeSeriesSchemaScanNode.java
@@ -21,7 +21,8 @@ package org.apache.iotdb.db.mpp.plan.planner.plan.node.metedata.read;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.metadata.template.Template;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
@@ -35,6 +36,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 public class TimeSeriesSchemaScanNode extends SchemaQueryScanNode {
 
@@ -45,7 +47,7 @@ public class TimeSeriesSchemaScanNode extends SchemaQueryScanNode {
   // if is true, the result will be sorted according to the inserting frequency of the timeseries
   private final boolean orderByHeat;
 
-  private Map<Integer, Template> templateMap;
+  private final Map<Integer, Template> templateMap;
 
   public TimeSeriesSchemaScanNode(
       PlanNodeId id,
@@ -197,7 +199,9 @@ public class TimeSeriesSchemaScanNode extends SchemaQueryScanNode {
 
   @Override
   public List<String> getOutputColumnNames() {
-    return HeaderConstant.showTimeSeriesHeader.getRespColumns();
+    return ColumnHeaderConstant.showTimeSeriesColumnHeaders.stream()
+        .map(ColumnHeader::getColumnName)
+        .collect(Collectors.toList());
   }
 
   @Override
diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java
index a410aa33d6..7f9c71940b 100644
--- a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java
+++ b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java
@@ -24,7 +24,7 @@ import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.metadata.path.AlignedPath;
 import org.apache.iotdb.db.metadata.path.MeasurementPath;
 import org.apache.iotdb.db.mpp.common.QueryId;
-import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.db.mpp.plan.expression.Expression;
 import org.apache.iotdb.db.mpp.plan.expression.binary.GreaterThanExpression;
 import org.apache.iotdb.db.mpp.plan.expression.binary.LogicAndExpression;
@@ -341,7 +341,7 @@ public class QueryLogicalPlanUtil {
                 Arrays.asList(
                     new SortItem(SortKey.DEVICE, Ordering.ASC),
                     new SortItem(SortKey.TIME, Ordering.DESC))),
-            Arrays.asList(HeaderConstant.COLUMN_DEVICE, "s3", "s1", "s2", "s4"),
+            Arrays.asList(ColumnHeaderConstant.COLUMN_DEVICE, "s3", "s1", "s2", "s4"),
             deviceToMeasurementIndexesMap);
     deviceViewNode.addChildDeviceNode("root.sg.d1", filterNode1);
     deviceViewNode.addChildDeviceNode("root.sg.d2", filterNode2);
@@ -721,7 +721,7 @@ public class QueryLogicalPlanUtil {
                     new SortItem(SortKey.DEVICE, Ordering.ASC),
                     new SortItem(SortKey.TIME, Ordering.DESC))),
             Arrays.asList(
-                HeaderConstant.COLUMN_DEVICE, "count(s1)", "max_value(s2)", "last_value(s1)"),
+                ColumnHeaderConstant.COLUMN_DEVICE, "count(s1)", "max_value(s2)", "last_value(s1)"),
             deviceToMeasurementIndexesMap);
     deviceViewNode.addChildDeviceNode("root.sg.d1", timeJoinNode1);
     deviceViewNode.addChildDeviceNode("root.sg.d2", timeJoinNode2);
@@ -1001,7 +1001,7 @@ public class QueryLogicalPlanUtil {
                     new SortItem(SortKey.DEVICE, Ordering.ASC),
                     new SortItem(SortKey.TIME, Ordering.DESC))),
             Arrays.asList(
-                HeaderConstant.COLUMN_DEVICE, "count(s1)", "max_value(s2)", "last_value(s1)"),
+                ColumnHeaderConstant.COLUMN_DEVICE, "count(s1)", "max_value(s2)", "last_value(s1)"),
             deviceToMeasurementIndexesMap);
     deviceViewNode.addChildDeviceNode("root.sg.d1", aggregationNode1);
     deviceViewNode.addChildDeviceNode("root.sg.d2", aggregationNode2);