You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by qi...@apache.org on 2022/08/21 15:32:11 UTC

[iotdb] branch master updated: [IOTDB-4174] Show RegionNum when show storagegroup (#7060)

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

qiaojialin 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 f3eb840b90 [IOTDB-4174] Show RegionNum when show storagegroup (#7060)
f3eb840b90 is described below

commit f3eb840b9002f1712a0689836f56a41e58a04925
Author: YongzaoDan <33...@users.noreply.github.com>
AuthorDate: Sun Aug 21 23:32:04 2022 +0800

    [IOTDB-4174] Show RegionNum when show storagegroup (#7060)
---
 .../consensus/response/StorageGroupSchemaResp.java |   7 +-
 .../confignode/manager/ClusterSchemaManager.java   |  43 +++++
 .../iotdb/confignode/manager/ConfigManager.java    |  11 ++
 .../apache/iotdb/confignode/manager/IManager.java  |  15 +-
 .../persistence/schema/ClusterSchemaInfo.java      |   6 +-
 .../service/thrift/ConfigNodeRPCService.java       |   2 +-
 .../thrift/ConfigNodeRPCServiceHandler.java        |   7 +-
 .../thrift/ConfigNodeRPCServiceProcessor.java      |  13 +-
 integration-test/import-control.xml                |   1 +
 .../org/apache/iotdb/db/it/IoTDBExampleIT.java     |   3 +-
 .../apache/iotdb/db/it/query/IoTDBResultSetIT.java |  30 ++-
 .../db/it/schema/IoTDBAutoCreateSchemaIT.java      |   5 +-
 .../db/it/schema/IoTDBCreateStorageGroupIT.java    |   3 +-
 .../db/it/schema/IoTDBCreateTimeseriesIT.java      |   5 +-
 .../db/it/schema/IoTDBSortedShowTimeseriesIT.java  |  65 +++----
 .../apache/iotdb/db/it/schema/IoTDBTagAlterIT.java | 209 +++++++++++----------
 .../apache/iotdb/db/integration/IoTDBTagIT.java    |  81 ++++----
 .../apache/iotdb/db/client/ConfigNodeClient.java   |  19 ++
 .../db/mpp/common/header/ColumnHeaderConstant.java |  14 +-
 .../config/executor/ClusterConfigTaskExecutor.java |   7 +-
 .../executor/StandaloneConfigTaskExecutor.java     |  17 +-
 .../config/metadata/ShowStorageGroupTask.java      |  21 ++-
 .../src/main/thrift/confignode.thrift              |  22 ++-
 23 files changed, 374 insertions(+), 232 deletions(-)

diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/response/StorageGroupSchemaResp.java b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/response/StorageGroupSchemaResp.java
index eb9f0aab00..aa7f43f78a 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/response/StorageGroupSchemaResp.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/response/StorageGroupSchemaResp.java
@@ -19,7 +19,6 @@
 package org.apache.iotdb.confignode.consensus.response;
 
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
-import org.apache.iotdb.commons.utils.TestOnly;
 import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
 import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchemaResp;
 import org.apache.iotdb.consensus.common.DataSet;
@@ -31,6 +30,7 @@ public class StorageGroupSchemaResp implements DataSet {
 
   private TSStatus status;
 
+  // Map<StorageGroupName, TStorageGroupSchema>
   private Map<String, TStorageGroupSchema> schemaMap;
 
   public StorageGroupSchemaResp() {}
@@ -47,14 +47,15 @@ public class StorageGroupSchemaResp implements DataSet {
     this.schemaMap = schemaMap;
   }
 
-  public void convertToRPCStorageGroupSchemaResp(TStorageGroupSchemaResp resp) {
+  public TStorageGroupSchemaResp convertToRPCStorageGroupSchemaResp() {
+    TStorageGroupSchemaResp resp = new TStorageGroupSchemaResp();
     resp.setStatus(status);
     if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
       resp.setStorageGroupSchemaMap(schemaMap);
     }
+    return resp;
   }
 
-  @TestOnly
   public Map<String, TStorageGroupSchema> getSchemaMap() {
     return schemaMap;
   }
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ClusterSchemaManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ClusterSchemaManager.java
index d203e18f5c..63df5c89c2 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ClusterSchemaManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ClusterSchemaManager.java
@@ -26,6 +26,7 @@ import org.apache.iotdb.common.rpc.thrift.TSetTTLReq;
 import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.utils.StatusUtils;
 import org.apache.iotdb.confignode.client.DataNodeRequestType;
 import org.apache.iotdb.confignode.client.async.datanode.AsyncDataNodeClientPool;
 import org.apache.iotdb.confignode.client.sync.datanode.SyncDataNodeClientPool;
@@ -48,12 +49,15 @@ import org.apache.iotdb.confignode.consensus.request.write.template.CreateSchema
 import org.apache.iotdb.confignode.consensus.request.write.template.SetSchemaTemplatePlan;
 import org.apache.iotdb.confignode.consensus.response.AllTemplateSetInfoResp;
 import org.apache.iotdb.confignode.consensus.response.PathInfoResp;
+import org.apache.iotdb.confignode.consensus.response.StorageGroupSchemaResp;
 import org.apache.iotdb.confignode.consensus.response.TemplateInfoResp;
 import org.apache.iotdb.confignode.exception.StorageGroupNotExistsException;
 import org.apache.iotdb.confignode.persistence.schema.ClusterSchemaInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TGetAllTemplatesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TGetPathsSetTemplatesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TGetTemplateResp;
+import org.apache.iotdb.confignode.rpc.thrift.TShowStorageGroupResp;
+import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
 import org.apache.iotdb.consensus.common.DataSet;
 import org.apache.iotdb.db.metadata.template.Template;
@@ -153,6 +157,45 @@ public class ClusterSchemaManager {
     return getConsensusManager().read(getStorageGroupPlan).getDataset();
   }
 
+  /** Only used in cluster tool show StorageGroup */
+  public TShowStorageGroupResp showStorageGroup(GetStorageGroupPlan getStorageGroupPlan) {
+    StorageGroupSchemaResp storageGroupSchemaResp =
+        (StorageGroupSchemaResp) getMatchedStorageGroupSchema(getStorageGroupPlan);
+    if (storageGroupSchemaResp.getStatus().getCode()
+        != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+      // Return immediately if some StorageGroups doesn't exist
+      return new TShowStorageGroupResp().setStatus(storageGroupSchemaResp.getStatus());
+    }
+
+    Map<String, TStorageGroupInfo> infoMap = new ConcurrentHashMap<>();
+    for (TStorageGroupSchema storageGroupSchema : storageGroupSchemaResp.getSchemaMap().values()) {
+      String name = storageGroupSchema.getName();
+      TStorageGroupInfo storageGroupInfo = new TStorageGroupInfo();
+      storageGroupInfo.setName(name);
+      storageGroupInfo.setTTL(storageGroupSchema.getTTL());
+      storageGroupInfo.setSchemaReplicationFactor(storageGroupSchema.getSchemaReplicationFactor());
+      storageGroupInfo.setDataReplicationFactor(storageGroupSchema.getDataReplicationFactor());
+      storageGroupInfo.setTimePartitionInterval(storageGroupSchema.getTimePartitionInterval());
+
+      try {
+        storageGroupInfo.setSchemaRegionNum(
+            getPartitionManager().getRegionCount(name, TConsensusGroupType.SchemaRegion));
+        storageGroupInfo.setDataRegionNum(
+            getPartitionManager().getRegionCount(name, TConsensusGroupType.DataRegion));
+      } catch (StorageGroupNotExistsException e) {
+        // Return immediately if some StorageGroups doesn't exist
+        return new TShowStorageGroupResp()
+            .setStatus(
+                new TSStatus(TSStatusCode.STORAGE_GROUP_NOT_EXIST.getStatusCode())
+                    .setMessage(e.getMessage()));
+      }
+
+      infoMap.put(name, storageGroupInfo);
+    }
+
+    return new TShowStorageGroupResp().setStorageGroupInfoMap(infoMap).setStatus(StatusUtils.OK);
+  }
+
   /**
    * Update TTL for the specific StorageGroup or all storage groups in a path
    *
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
index 295cad7127..cbd983b3c9 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
@@ -94,6 +94,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TSetSchemaTemplateReq;
 import org.apache.iotdb.confignode.rpc.thrift.TShowClusterResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowConfigNodesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowDataNodesResp;
+import org.apache.iotdb.confignode.rpc.thrift.TShowStorageGroupResp;
 import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
 import org.apache.iotdb.consensus.common.DataSet;
 import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree;
@@ -934,6 +935,16 @@ public class ConfigManager implements IManager {
     }
   }
 
+  @Override
+  public TShowStorageGroupResp showStorageGroup(GetStorageGroupPlan getStorageGroupPlan) {
+    TSStatus status = confirmLeader();
+    if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+      return getClusterSchemaManager().showStorageGroup(getStorageGroupPlan);
+    } else {
+      return new TShowStorageGroupResp().setStatus(status);
+    }
+  }
+
   @Override
   public ProcedureManager getProcedureManager() {
     return procedureManager;
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
index 08d822d3c6..e63984b75d 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
@@ -51,6 +51,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TSetSchemaTemplateReq;
 import org.apache.iotdb.confignode.rpc.thrift.TShowClusterResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowConfigNodesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowDataNodesResp;
+import org.apache.iotdb.confignode.rpc.thrift.TShowStorageGroupResp;
 import org.apache.iotdb.consensus.common.DataSet;
 import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree;
 
@@ -128,7 +129,7 @@ public interface IManager {
   /**
    * Remove DataNode
    *
-   * @param removeDataNodePlan
+   * @param removeDataNodePlan RemoveDataNodePlan
    * @return DataNodeToStatusResp
    */
   DataSet removeDataNode(RemoveDataNodePlan removeDataNodePlan);
@@ -306,6 +307,14 @@ public interface IManager {
   /** Show ConfigNodes */
   TShowConfigNodesResp showConfigNodes();
 
+  /**
+   * Show StorageGroup
+   *
+   * @param getStorageGroupPlan GetStorageGroupPlan, including path patterns about StorageGroups
+   * @return TShowStorageGroupResp
+   */
+  TShowStorageGroupResp showStorageGroup(GetStorageGroupPlan getStorageGroupPlan);
+
   /**
    * create schema template
    *
@@ -317,7 +326,7 @@ public interface IManager {
   /**
    * show schema templates
    *
-   * @return
+   * @return TGetAllTemplatesResp
    */
   TGetAllTemplatesResp getAllTemplates();
 
@@ -325,7 +334,7 @@ public interface IManager {
    * show nodes in schema template
    *
    * @param req String
-   * @return
+   * @return TGetTemplateResp
    */
   TGetTemplateResp getTemplate(String req);
 
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
index 624b2d5bf4..757aec8a26 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
@@ -157,7 +157,7 @@ public class ClusterSchemaInfo implements SnapshotProcessor {
       LOGGER.warn("Storage group not exist", e);
       result
           .setCode(TSStatusCode.SUCCESS_STATUS.getStatusCode())
-          .setMessage("Storage group not exist");
+          .setMessage("Storage group not exist: " + e.getMessage());
     } finally {
       storageGroupReadWriteLock.writeLock().unlock();
     }
@@ -176,7 +176,7 @@ public class ClusterSchemaInfo implements SnapshotProcessor {
       LOGGER.error("Error StorageGroup name", e);
       result.setStatus(
           new TSStatus(TSStatusCode.STORAGE_GROUP_NOT_EXIST.getStatusCode())
-              .setMessage("Error StorageGroup name"));
+              .setMessage("Error StorageGroup name: " + e.getMessage()));
     } finally {
       storageGroupReadWriteLock.readLock().unlock();
     }
@@ -202,7 +202,7 @@ public class ClusterSchemaInfo implements SnapshotProcessor {
       LOGGER.error("Error StorageGroup name", e);
       result.setStatus(
           new TSStatus(TSStatusCode.STORAGE_GROUP_NOT_EXIST.getStatusCode())
-              .setMessage("Error StorageGroup name"));
+              .setMessage("Error StorageGroup name: " + e.getMessage()));
     } finally {
       storageGroupReadWriteLock.readLock().unlock();
     }
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCService.java b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCService.java
index eb0ccb8c5f..740774944f 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCService.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCService.java
@@ -77,7 +77,7 @@ public class ConfigNodeRPCService extends ThriftService implements ConfigNodeRPC
               getBindPort(),
               configConf.getRpcMaxConcurrentClientNum(),
               configConf.getThriftServerAwaitTimeForStopService(),
-              new ConfigNodeRPCServiceHandler(configNodeRPCServiceProcessor),
+              new ConfigNodeRPCServiceHandler(),
               commonConfig.isRpcThriftCompressionEnabled());
     } catch (RPCServiceException e) {
       throw new IllegalAccessException(e.getMessage());
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceHandler.java b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceHandler.java
index 9fd02b55d6..1ace76c612 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceHandler.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceHandler.java
@@ -27,11 +27,8 @@ import org.apache.thrift.server.TServerEventHandler;
 import org.apache.thrift.transport.TTransport;
 
 public class ConfigNodeRPCServiceHandler implements TServerEventHandler {
-  private final ConfigNodeRPCServiceProcessor processor;
 
-  public ConfigNodeRPCServiceHandler(ConfigNodeRPCServiceProcessor processor) {
-    this.processor = processor;
-  }
+  public ConfigNodeRPCServiceHandler() {}
 
   @Override
   public ServerContext createContext(TProtocol arg0, TProtocol arg1) {
@@ -47,8 +44,6 @@ public class ConfigNodeRPCServiceHandler implements TServerEventHandler {
 
   @Override
   public void deleteContext(ServerContext arg0, TProtocol arg1, TProtocol arg2) {
-    // release query resources.
-    processor.handleClientExit();
     MetricService.getInstance()
         .getOrCreateGauge(
             Metric.THRIFT_CONNECTIONS.toString(),
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
index 90dfdc2c11..3bd01f2320 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
@@ -99,6 +99,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TShowConfigNodesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowDataNodesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowRegionReq;
 import org.apache.iotdb.confignode.rpc.thrift.TShowRegionResp;
+import org.apache.iotdb.confignode.rpc.thrift.TShowStorageGroupResp;
 import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
 import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchemaResp;
 import org.apache.iotdb.confignode.service.ConfigNode;
@@ -276,9 +277,7 @@ public class ConfigNodeRPCServiceProcessor implements IConfigNodeRPCService.Ifac
             configManager.getMatchedStorageGroupSchemas(
                 new GetStorageGroupPlan(storageGroupPathPattern));
 
-    TStorageGroupSchemaResp resp = new TStorageGroupSchemaResp();
-    storageGroupSchemaResp.convertToRPCStorageGroupSchemaResp(resp);
-    return resp;
+    return storageGroupSchemaResp.convertToRPCStorageGroupSchemaResp();
   }
 
   @Override
@@ -568,9 +567,11 @@ public class ConfigNodeRPCServiceProcessor implements IConfigNodeRPCService.Ifac
     return configManager.showConfigNodes();
   }
 
-  public void handleClientExit() {}
-
-  // TODO: Interfaces for data operations
+  @Override
+  public TShowStorageGroupResp showStorageGroup(List<String> storageGroupPathPattern)
+      throws TException {
+    return configManager.showStorageGroup(new GetStorageGroupPlan(storageGroupPathPattern));
+  }
 
   @Override
   public TSStatus createSchemaTemplate(TCreateSchemaTemplateReq req) throws TException {
diff --git a/integration-test/import-control.xml b/integration-test/import-control.xml
index 7ccb1ca24f..4a13fc9078 100644
--- a/integration-test/import-control.xml
+++ b/integration-test/import-control.xml
@@ -42,4 +42,5 @@
   <allow pkg="org\.apache\.iotdb\.commons\.auth\.entity.*" regex="true"/>
   <allow pkg="org\.apache\.iotdb\.commons\.conf.*" regex="true"/>
   <allow pkg="org\.apache\.iotdb\.db\.qp\.logical\.sys.*" regex="true"/>
+  <allow pkg="org\.apache\.iotdb\.db\.mpp\.common\.header.*" regex="true" />
 </import-control>
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBExampleIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBExampleIT.java
index 528708b3e1..f8e6a1ef22 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBExampleIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBExampleIT.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.it;
 
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
 import org.apache.iotdb.itbase.category.ClusterIT;
@@ -57,7 +58,7 @@ public class IoTDBExampleIT {
       statement.execute("set storage group to root.sg");
       try (ResultSet resultSet = statement.executeQuery("show storage group")) {
         if (resultSet.next()) {
-          String storageGroupPath = resultSet.getString("storage group");
+          String storageGroupPath = resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP);
           Assert.assertEquals("root.sg", storageGroupPath);
         } else {
           Assert.fail("This ResultSet is empty.");
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBResultSetIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBResultSetIT.java
index ab0e72d405..8f2db6c50d 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBResultSetIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/query/IoTDBResultSetIT.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.it.query;
 
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
 import org.apache.iotdb.itbase.category.ClusterIT;
@@ -138,27 +139,48 @@ public class IoTDBResultSetIT {
 
   @Test
   public void emptyQueryTest1() {
-    String expectedHeader = "Time,";
+    String expectedHeader = ColumnHeaderConstant.COLUMN_TIME + ",";
     resultSetEqualTest("select * from root.sg1.d1", expectedHeader, emptyResultSet);
   }
 
   @Test
   public void emptyQueryTest2() {
     String expectedHeader =
-        "Time,root.t1.wf01.wt02.grade,root.t1.wf01.wt02.temperature,root.t1.wf01.wt02.type,root.t1.wf01.wt02.status,";
+        ColumnHeaderConstant.COLUMN_TIME
+            + ","
+            + "root.t1.wf01.wt02.grade,"
+            + "root.t1.wf01.wt02.temperature,"
+            + "root.t1.wf01.wt02.type,"
+            + "root.t1.wf01.wt02.status,";
     resultSetEqualTest("select * from root.t1.wf01.wt02", expectedHeader, emptyResultSet);
   }
 
   @Test
   public void emptyShowTimeseriesTest() {
     String expectedHeader =
-        "timeseries,alias,storage group,dataType,encoding,compression,tags,attributes,";
+        ColumnHeaderConstant.COLUMN_TIMESERIES
+            + ","
+            + ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS
+            + ","
+            + ColumnHeaderConstant.COLUMN_STORAGE_GROUP
+            + ","
+            + ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE
+            + ","
+            + ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING
+            + ","
+            + ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION
+            + ","
+            + ColumnHeaderConstant.COLUMN_TAGS
+            + ","
+            + ColumnHeaderConstant.COLUMN_ATTRIBUTES
+            + ",";
     resultSetEqualTest("show timeseries root.sg1.**", expectedHeader, emptyResultSet);
   }
 
   @Test
   public void emptyShowDeviceTest() {
-    String expectedHeader = "devices,isAligned,";
+    String expectedHeader =
+        ColumnHeaderConstant.COLUMN_DEVICES + "," + ColumnHeaderConstant.COLUMN_IS_ALIGNED + ",";
     resultSetEqualTest("show devices root.sg1.**", expectedHeader, emptyResultSet);
   }
 }
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAutoCreateSchemaIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAutoCreateSchemaIT.java
index aeb02f151f..c26f1ddb59 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAutoCreateSchemaIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBAutoCreateSchemaIT.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.it.schema;
 
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
 import org.apache.iotdb.itbase.category.ClusterIT;
@@ -186,7 +187,7 @@ public class IoTDBAutoCreateSchemaIT {
     Set<String> resultList = new HashSet<>();
     try (ResultSet resultSet = statement.executeQuery("show timeseries")) {
       while (resultSet.next()) {
-        String str = resultSet.getString("timeseries");
+        String str = resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES);
         resultList.add(str);
       }
     }
@@ -195,7 +196,7 @@ public class IoTDBAutoCreateSchemaIT {
     resultList.clear();
     try (ResultSet resultSet = statement.executeQuery("show storage group")) {
       while (resultSet.next()) {
-        resultList.add(resultSet.getString("storage group"));
+        resultList.add(resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP));
       }
     }
     Assert.assertTrue(resultList.contains(storageGroup));
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBCreateStorageGroupIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBCreateStorageGroupIT.java
index 2799282378..43e3d2db97 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBCreateStorageGroupIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBCreateStorageGroupIT.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.it.schema;
 
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
 import org.apache.iotdb.itbase.category.ClusterIT;
@@ -93,7 +94,7 @@ public class IoTDBCreateStorageGroupIT {
     List<String> resultList = new ArrayList<>();
     try (ResultSet resultSet = statement.executeQuery("show storage group")) {
       while (resultSet.next()) {
-        String storageGroupPath = resultSet.getString("storage group");
+        String storageGroupPath = resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP);
         resultList.add(storageGroupPath);
       }
     }
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBCreateTimeseriesIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBCreateTimeseriesIT.java
index 3cafa22ea4..51565b8f41 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBCreateTimeseriesIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBCreateTimeseriesIT.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.it.schema;
 
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
 import org.apache.iotdb.itbase.category.ClusterIT;
@@ -84,7 +85,7 @@ public class IoTDBCreateTimeseriesIT {
         Statement statement = connection.createStatement();
         ResultSet resultSet = statement.executeQuery("show timeseries")) {
       while (resultSet.next()) {
-        String str = resultSet.getString("timeseries");
+        String str = resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES);
         resultList.add(str);
       }
     }
@@ -94,7 +95,7 @@ public class IoTDBCreateTimeseriesIT {
         Statement statement = connection.createStatement();
         ResultSet resultSet = statement.executeQuery("show storage group")) {
       while (resultSet.next()) {
-        String res = resultSet.getString("storage group");
+        String res = resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP);
         resultList.add(res);
       }
     }
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBSortedShowTimeseriesIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBSortedShowTimeseriesIT.java
index c1554b081b..062938e366 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBSortedShowTimeseriesIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBSortedShowTimeseriesIT.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.it.schema;
 
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
 import org.apache.iotdb.itbase.category.ClusterIT;
@@ -169,21 +170,21 @@ public class IoTDBSortedShowTimeseriesIT {
       int count = 0;
       while (resultSet.next()) {
         String ans =
-            resultSet.getString("timeseries")
+            resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                 + ","
-                + resultSet.getString("alias")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                 + ","
-                + resultSet.getString("storage group")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                 + ","
-                + resultSet.getString("dataType")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                 + ","
-                + resultSet.getString("encoding")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                 + ","
-                + resultSet.getString("compression")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                 + ","
-                + resultSet.getString("tags")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                 + ","
-                + resultSet.getString("attributes");
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
 
         assertTrue(retArray1.contains(ans));
         count++;
@@ -195,21 +196,21 @@ public class IoTDBSortedShowTimeseriesIT {
       count = 0;
       while (resultSet.next()) {
         String ans =
-            resultSet.getString("timeseries")
+            resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                 + ","
-                + resultSet.getString("alias")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                 + ","
-                + resultSet.getString("storage group")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                 + ","
-                + resultSet.getString("dataType")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                 + ","
-                + resultSet.getString("encoding")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                 + ","
-                + resultSet.getString("compression")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                 + ","
-                + resultSet.getString("tags")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                 + ","
-                + resultSet.getString("attributes");
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
         System.out.println("\"" + ans + "\",");
         assertTrue(retArray2.contains(ans));
         count++;
@@ -247,21 +248,21 @@ public class IoTDBSortedShowTimeseriesIT {
       int count = 0;
       while (resultSet.next()) {
         String ans =
-            resultSet.getString("timeseries")
+            resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                 + ","
-                + resultSet.getString("alias")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                 + ","
-                + resultSet.getString("storage group")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                 + ","
-                + resultSet.getString("dataType")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                 + ","
-                + resultSet.getString("encoding")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                 + ","
-                + resultSet.getString("compression")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                 + ","
-                + resultSet.getString("tags")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                 + ","
-                + resultSet.getString("attributes");
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
 
         System.out.println(ans);
         assertTrue(retSet.contains(ans));
@@ -296,21 +297,21 @@ public class IoTDBSortedShowTimeseriesIT {
       int count = 0;
       while (resultSet.next()) {
         String ans =
-            resultSet.getString("timeseries")
+            resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                 + ","
-                + resultSet.getString("alias")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                 + ","
-                + resultSet.getString("storage group")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                 + ","
-                + resultSet.getString("dataType")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                 + ","
-                + resultSet.getString("encoding")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                 + ","
-                + resultSet.getString("compression")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                 + ","
-                + resultSet.getString("tags")
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                 + ","
-                + resultSet.getString("attributes");
+                + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
 
         assertEquals(retArray[count], ans);
         count++;
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBTagAlterIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBTagAlterIT.java
index e8dd0e5788..b648d664b6 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBTagAlterIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBTagAlterIT.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.it.schema;
 
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
 import org.apache.iotdb.itbase.category.ClusterIT;
@@ -74,21 +75,21 @@ public class IoTDBTagAlterIT {
       try {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
           assertEquals(ret1[count], ans);
           count++;
         }
@@ -122,21 +123,21 @@ public class IoTDBTagAlterIT {
       try {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
           assertEquals(ret2[count], ans);
           count++;
         }
@@ -172,21 +173,21 @@ public class IoTDBTagAlterIT {
       try {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
           assertEquals(ret[count], ans);
           count++;
         }
@@ -210,21 +211,21 @@ public class IoTDBTagAlterIT {
       try {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
           assertEquals(ret2[count], ans);
           count++;
         }
@@ -259,21 +260,21 @@ public class IoTDBTagAlterIT {
       try {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
           assertEquals(ret[count], ans);
           count++;
         }
@@ -288,21 +289,21 @@ public class IoTDBTagAlterIT {
       try {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
           assertEquals(ret2[count], ans);
           count++;
         }
@@ -342,21 +343,21 @@ public class IoTDBTagAlterIT {
       try {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
           assertEquals(ret[count], ans);
           count++;
         }
@@ -371,21 +372,21 @@ public class IoTDBTagAlterIT {
       try {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
           assertEquals(ret2[count], ans);
           count++;
         }
@@ -421,21 +422,21 @@ public class IoTDBTagAlterIT {
       try {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
           assertEquals(ret[count], ans);
           count++;
         }
@@ -451,21 +452,21 @@ public class IoTDBTagAlterIT {
       try {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
           assertEquals(ret2[count], ans);
           count++;
         }
@@ -505,21 +506,21 @@ public class IoTDBTagAlterIT {
       try {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
           assertEquals(ret[count], ans);
           count++;
         }
@@ -535,21 +536,21 @@ public class IoTDBTagAlterIT {
       try {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
           assertEquals(ret2[count], ans);
           count++;
         }
@@ -566,21 +567,21 @@ public class IoTDBTagAlterIT {
       try {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
           assertEquals(ret3[count], ans);
           count++;
         }
diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBTagIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBTagIT.java
index 14a1df0d8f..eaac40ef72 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBTagIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBTagIT.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.integration;
 
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
 import org.apache.iotdb.integration.env.EnvFactory;
 import org.apache.iotdb.itbase.category.ClusterTest;
 import org.apache.iotdb.itbase.category.LocalStandaloneTest;
@@ -85,21 +86,21 @@ public class IoTDBTagIT {
       try (ResultSet resultSet = statement.getResultSet()) {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
 
           assertTrue(ret1.contains(ans));
           count++;
@@ -114,21 +115,21 @@ public class IoTDBTagIT {
       try (ResultSet resultSet = statement.getResultSet()) {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
 
           assertTrue(ret2.contains(ans));
           count++;
@@ -172,21 +173,21 @@ public class IoTDBTagIT {
       try (ResultSet resultSet = statement.getResultSet()) {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
 
           assertTrue(ret1.contains(ans));
           count++;
@@ -201,21 +202,21 @@ public class IoTDBTagIT {
       try (ResultSet resultSet = statement.getResultSet()) {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
 
           assertTrue(ret2.contains(ans));
           count++;
@@ -283,21 +284,21 @@ public class IoTDBTagIT {
       try (ResultSet resultSet = statement.getResultSet()) {
         while (resultSet.next()) {
           String ans =
-              resultSet.getString("timeseries")
+              resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES)
                   + ","
-                  + resultSet.getString("alias")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ALIAS)
                   + ","
-                  + resultSet.getString("storage group")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_STORAGE_GROUP)
                   + ","
-                  + resultSet.getString("dataType")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_DATATYPE)
                   + ","
-                  + resultSet.getString("encoding")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_ENCODING)
                   + ","
-                  + resultSet.getString("compression")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TIMESERIES_COMPRESSION)
                   + ","
-                  + resultSet.getString("tags")
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_TAGS)
                   + ","
-                  + resultSet.getString("attributes");
+                  + resultSet.getString(ColumnHeaderConstant.COLUMN_ATTRIBUTES);
 
           res.add(ans);
           count++;
diff --git a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
index 4e43299f91..55522005f9 100644
--- a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
+++ b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
@@ -74,6 +74,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TShowConfigNodesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowDataNodesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowRegionReq;
 import org.apache.iotdb.confignode.rpc.thrift.TShowRegionResp;
+import org.apache.iotdb.confignode.rpc.thrift.TShowStorageGroupResp;
 import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchemaResp;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
@@ -861,6 +862,24 @@ public class ConfigNodeClient
     throw new TException(MSG_RECONNECTION_FAIL);
   }
 
+  @Override
+  public TShowStorageGroupResp showStorageGroup(List<String> storageGroupPathPattern)
+      throws TException {
+    for (int i = 0; i < RETRY_NUM; i++) {
+      try {
+        TShowStorageGroupResp showStorageGroupResp =
+            client.showStorageGroup(storageGroupPathPattern);
+        if (!updateConfigNodeLeader(showStorageGroupResp.getStatus())) {
+          return showStorageGroupResp;
+        }
+      } catch (TException e) {
+        configLeader = null;
+      }
+      reconnect();
+    }
+    throw new TException(MSG_RECONNECTION_FAIL);
+  }
+
   @Override
   public TRegionRouteMapResp getLatestRegionRouteMap() throws TException {
     for (int i = 0; i < RETRY_NUM; i++) {
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
index b90626b6b3..9d242bcdb3 100644
--- 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
@@ -45,9 +45,9 @@ public class ColumnHeaderConstant {
   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_SCHEMA_REPLICATION_FACTOR = "SchemaReplicationFactor";
+  public static final String COLUMN_DATA_REPLICATION_FACTOR = "DataReplicationFactor";
+  public static final String COLUMN_TIME_PARTITION_INTERVAL = "TimePartitionInterval";
   public static final String COLUMN_CHILDPATHS = "child paths";
   public static final String COLUMN_NODETYPES = "node types";
   public static final String COLUMN_CHILDNODES = "child nodes";
@@ -77,8 +77,8 @@ public class ColumnHeaderConstant {
   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_SERIES_SLOTS = "SeriesSlots";
+  public static final String COLUMN_TIME_SLOTS = "TimeSlots";
   public static final String COLUMN_ROLE = "Role";
 
   // column names for show datanodes
@@ -127,7 +127,9 @@ public class ColumnHeaderConstant {
           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));
+          new ColumnHeader(COLUMN_TIME_PARTITION_INTERVAL, TSDataType.INT64),
+          new ColumnHeader(COLUMN_SCHEMA_REGION_NUM, TSDataType.INT32),
+          new ColumnHeader(COLUMN_DATA_REGION_NUM, TSDataType.INT32));
 
   public static final List<ColumnHeader> showChildPathsColumnHeaders =
       ImmutableList.of(
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index f50fb5ec11..39ea7bb10f 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -37,6 +37,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TShowConfigNodesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowDataNodesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowRegionReq;
 import org.apache.iotdb.confignode.rpc.thrift.TShowRegionResp;
+import org.apache.iotdb.confignode.rpc.thrift.TShowStorageGroupResp;
 import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
 import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchemaResp;
 import org.apache.iotdb.db.client.ConfigNodeClient;
@@ -136,17 +137,15 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor {
   public SettableFuture<ConfigTaskResult> showStorageGroup(
       ShowStorageGroupStatement showStorageGroupStatement) {
     SettableFuture<ConfigTaskResult> future = SettableFuture.create();
-    Map<String, TStorageGroupSchema> storageGroupSchemaMap;
     // Construct request using statement
     List<String> storageGroupPathPattern =
         Arrays.asList(showStorageGroupStatement.getPathPattern().getNodes());
     try (ConfigNodeClient client =
         CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.partitionRegionId)) {
       // Send request to some API server
-      TStorageGroupSchemaResp resp = client.getMatchedStorageGroupSchemas(storageGroupPathPattern);
-      storageGroupSchemaMap = resp.getStorageGroupSchemaMap();
+      TShowStorageGroupResp resp = client.showStorageGroup(storageGroupPathPattern);
       // build TSBlock
-      ShowStorageGroupTask.buildTSBlock(storageGroupSchemaMap, future);
+      ShowStorageGroupTask.buildTSBlock(resp.getStorageGroupInfoMap(), future);
     } catch (TException | IOException e) {
       future.setException(e);
     }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
index 25ebce7694..2764c5b54f 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
@@ -26,6 +26,7 @@ import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.udf.service.UDFExecutableManager;
 import org.apache.iotdb.commons.udf.service.UDFRegistrationService;
+import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
 import org.apache.iotdb.db.localconfignode.LocalConfigNode;
 import org.apache.iotdb.db.metadata.mnode.IStorageGroupMNode;
@@ -98,7 +99,7 @@ public class StandaloneConfigTaskExecutor implements IConfigTaskExecutor {
   public SettableFuture<ConfigTaskResult> showStorageGroup(
       ShowStorageGroupStatement showStorageGroupStatement) {
     SettableFuture<ConfigTaskResult> future = SettableFuture.create();
-    Map<String, TStorageGroupSchema> storageGroupSchemaMap = new HashMap<>();
+    Map<String, TStorageGroupInfo> storageGroupInfoMap = new HashMap<>();
     try {
       LocalConfigNode localConfigNode = LocalConfigNode.getInstance();
       List<PartialPath> partialPaths =
@@ -109,10 +110,20 @@ public class StandaloneConfigTaskExecutor implements IConfigTaskExecutor {
             localConfigNode.getStorageGroupNodeByPath(storageGroupPath);
         String storageGroup = storageGroupMNode.getFullPath();
         TStorageGroupSchema storageGroupSchema = storageGroupMNode.getStorageGroupSchema();
-        storageGroupSchemaMap.put(storageGroup, storageGroupSchema);
+
+        TStorageGroupInfo storageGroupInfo = new TStorageGroupInfo();
+        storageGroupInfo.setName(storageGroup);
+        storageGroupInfo.setTTL(storageGroupSchema.getTTL());
+        storageGroupInfo.setSchemaReplicationFactor(
+            storageGroupSchema.getSchemaReplicationFactor());
+        storageGroupInfo.setDataReplicationFactor(storageGroupSchema.getDataReplicationFactor());
+        storageGroupInfo.setTimePartitionInterval(storageGroupSchema.getTimePartitionInterval());
+        storageGroupInfo.setSchemaRegionNum(1);
+        storageGroupInfo.setDataRegionNum(1);
+        storageGroupInfoMap.put(storageGroup, storageGroupInfo);
       }
       // build TSBlock
-      ShowStorageGroupTask.buildTSBlock(storageGroupSchemaMap, future);
+      ShowStorageGroupTask.buildTSBlock(storageGroupInfoMap, future);
     } catch (MetadataException e) {
       future.setException(e);
     }
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 a0557c58bd..372ee9d2f7 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
@@ -19,7 +19,7 @@
 
 package org.apache.iotdb.db.mpp.plan.execution.config.metadata;
 
-import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
+import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupInfo;
 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;
@@ -55,26 +55,27 @@ public class ShowStorageGroupTask implements IConfigTask {
   }
 
   public static void buildTSBlock(
-      Map<String, TStorageGroupSchema> storageGroupSchemaMap,
-      SettableFuture<ConfigTaskResult> future) {
+      Map<String, TStorageGroupInfo> storageGroupInfoMap, SettableFuture<ConfigTaskResult> future) {
     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()) {
+    for (Map.Entry<String, TStorageGroupInfo> entry : storageGroupInfoMap.entrySet()) {
       String storageGroup = entry.getKey();
-      TStorageGroupSchema storageGroupSchema = entry.getValue();
+      TStorageGroupInfo storageGroupInfo = entry.getValue();
       builder.getTimeColumnBuilder().writeLong(0L);
       builder.getColumnBuilder(0).writeBinary(new Binary(storageGroup));
-      if (Long.MAX_VALUE == storageGroupSchema.getTTL()) {
+      if (Long.MAX_VALUE == storageGroupInfo.getTTL()) {
         builder.getColumnBuilder(1).appendNull();
       } else {
-        builder.getColumnBuilder(1).writeLong(storageGroupSchema.getTTL());
+        builder.getColumnBuilder(1).writeLong(storageGroupInfo.getTTL());
       }
-      builder.getColumnBuilder(2).writeInt(storageGroupSchema.getSchemaReplicationFactor());
-      builder.getColumnBuilder(3).writeInt(storageGroupSchema.getDataReplicationFactor());
-      builder.getColumnBuilder(4).writeLong(storageGroupSchema.getTimePartitionInterval());
+      builder.getColumnBuilder(2).writeInt(storageGroupInfo.getSchemaReplicationFactor());
+      builder.getColumnBuilder(3).writeInt(storageGroupInfo.getDataReplicationFactor());
+      builder.getColumnBuilder(4).writeLong(storageGroupInfo.getTimePartitionInterval());
+      builder.getColumnBuilder(5).writeInt(storageGroupInfo.getSchemaRegionNum());
+      builder.getColumnBuilder(6).writeInt(storageGroupInfo.getDataRegionNum());
       builder.declarePosition();
     }
     DatasetHeader datasetHeader = DatasetHeaderFactory.getShowStorageGroupHeader();
diff --git a/thrift-confignode/src/main/thrift/confignode.thrift b/thrift-confignode/src/main/thrift/confignode.thrift
index 2421aefa71..f4656f3b56 100644
--- a/thrift-confignode/src/main/thrift/confignode.thrift
+++ b/thrift-confignode/src/main/thrift/confignode.thrift
@@ -102,7 +102,7 @@ struct TCountStorageGroupResp {
 
 struct TStorageGroupSchemaResp {
   1: required common.TSStatus status
-  // map<string, StorageGroupMessage>
+  // map<string, TStorageGroupSchema>
   2: optional map<string, TStorageGroupSchema> storageGroupSchemaMap
 }
 
@@ -280,6 +280,23 @@ struct TShowConfigNodesResp {
   2: optional list<TConfigNodeInfo> configNodesInfoList
 }
 
+// Show storageGroup
+struct TStorageGroupInfo {
+  1: required string name
+  2: required i64 TTL
+  3: required i32 schemaReplicationFactor
+  4: required i32 dataReplicationFactor
+  5: required i64 timePartitionInterval
+  6: required i32 schemaRegionNum
+  7: required i32 dataRegionNum
+}
+
+struct TShowStorageGroupResp {
+  1: required common.TSStatus status
+  // map<StorageGroupName, TStorageGroupInfo>
+  2: optional map<string, TStorageGroupInfo> storageGroupInfoMap
+}
+
 // Show regions
 struct TShowRegionReq {
   1: optional common.TConsensusGroupType consensusGroupType;
@@ -621,6 +638,9 @@ service IConfigNodeRPCService {
   /** Show cluster ConfigNodes' information */
   TShowConfigNodesResp showConfigNodes()
 
+  /** Show cluster StorageGroups' information */
+  TShowStorageGroupResp showStorageGroup(list<string> storageGroupPathPattern)
+
   /**
    * Show the matched cluster Regions' information
    * See https://apache-iotdb.feishu.cn/docx/doxcnOzmIlaE2MX5tKjmYWuMSRg for detailed matching rules