You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xi...@apache.org on 2021/06/25 09:33:22 UTC

[iotdb] 02/02: Optimize vector query logic version 1

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

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

commit 8008857c4ee2c85445711f4adfba651e268da17f
Author: Alima777 <wx...@gmail.com>
AuthorDate: Fri Jun 25 17:32:46 2021 +0800

    Optimize vector query logic version 1
---
 .../apache/iotdb/cluster/metadata/CMManager.java   |   2 +-
 .../iotdb/AlignedTimeseriesSessionExample.java     |   4 +-
 .../iotdb/db/engine/memtable/AbstractMemTable.java |  16 +-
 .../db/engine/memtable/PrimitiveMemTable.java      |   2 +-
 .../db/engine/querycontext/ReadOnlyMemChunk.java   |  18 +-
 .../engine/storagegroup/StorageGroupProcessor.java |   2 +-
 .../db/engine/storagegroup/TsFileProcessor.java    |  20 +-
 .../org/apache/iotdb/db/metadata/MManager.java     |  20 +-
 .../java/org/apache/iotdb/db/metadata/MTree.java   | 239 +++++++++++++++------
 .../iotdb/db/metadata/VectorPartialPath.java       |   1 -
 .../iotdb/db/metadata/mnode/MeasurementMNode.java  |   4 +-
 .../iotdb/db/metadata/template/Template.java       |   2 +-
 .../iotdb/db/qp/logical/crud/QueryOperator.java    |   2 +-
 .../iotdb/db/qp/physical/crud/InsertRowPlan.java   |   2 +-
 .../db/qp/physical/crud/RawDataQueryPlan.java      |   2 +-
 .../java/org/apache/iotdb/db/utils/MemUtils.java   |   2 +-
 .../iotdb/db/writelog/recover/LogReplayer.java     |   4 +-
 .../java/org/apache/iotdb/session/Session.java     |  10 +-
 .../org/apache/iotdb/session/SessionUtils.java     |   4 +-
 .../apache/iotdb/session/IoTDBSessionSimpleIT.java |   6 +-
 .../tsfile/write/chunk/VectorChunkWriterImpl.java  |   8 +-
 .../apache/iotdb/tsfile/write/record/Tablet.java   |  16 +-
 .../tsfile/write/schema/IMeasurementSchema.java    |  10 +-
 .../tsfile/write/schema/MeasurementSchema.java     |  10 +-
 .../write/schema/VectorMeasurementSchema.java      |  66 +++---
 .../write/writer/VectorMeasurementSchemaStub.java  |  10 +-
 26 files changed, 299 insertions(+), 183 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java
index 170ef49..20a3225 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java
@@ -226,7 +226,7 @@ public class CMManager extends MManager {
             new MeasurementMNode(
                 null, measurementSchema.getMeasurementId(), measurementSchema, null);
         if (measurementSchema instanceof VectorMeasurementSchema) {
-          for (String subSensorId : measurementSchema.getValueMeasurementIdList()) {
+          for (String subSensorId : measurementSchema.getSubMeasurementsList()) {
             cacheMeta(new PartialPath(path.getDevice(), subSensorId), measurementMNode, false);
           }
           cacheMeta(
diff --git a/example/session/src/main/java/org/apache/iotdb/AlignedTimeseriesSessionExample.java b/example/session/src/main/java/org/apache/iotdb/AlignedTimeseriesSessionExample.java
index 2bbde9a..bf43a61 100644
--- a/example/session/src/main/java/org/apache/iotdb/AlignedTimeseriesSessionExample.java
+++ b/example/session/src/main/java/org/apache/iotdb/AlignedTimeseriesSessionExample.java
@@ -255,11 +255,11 @@ public class AlignedTimeseriesSessionExample {
       int rowIndex = tablet.rowSize++;
       tablet.addTimestamp(rowIndex, timestamp);
       tablet.addValue(
-          schemaList.get(0).getValueMeasurementIdList().get(0),
+          schemaList.get(0).getSubMeasurementsList().get(0),
           rowIndex,
           new SecureRandom().nextLong());
       tablet.addValue(
-          schemaList.get(0).getValueMeasurementIdList().get(1),
+          schemaList.get(0).getSubMeasurementsList().get(1),
           rowIndex,
           new SecureRandom().nextInt());
 
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
index 170f49c..f12f73a 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
@@ -129,14 +129,14 @@ public abstract class AbstractMemTable implements IMemTable {
       if (measurementMNode != null) {
         // write vector
         Object[] vectorValue =
-            new Object[measurementMNode.getSchema().getValueTSDataTypeList().size()];
+            new Object[measurementMNode.getSchema().getSubMeasurementsTSDataTypeList().size()];
         for (int j = 0; j < vectorValue.length; j++) {
           vectorValue[j] = values[columnIndex];
           columnIndex++;
         }
         memSize +=
             MemUtils.getVectorRecordSize(
-                measurementMNode.getSchema().getValueTSDataTypeList(),
+                measurementMNode.getSchema().getSubMeasurementsTSDataTypeList(),
                 vectorValue,
                 disableMemControl);
         write(
@@ -207,9 +207,9 @@ public abstract class AbstractMemTable implements IMemTable {
       if (insertTabletPlan.isAligned()) {
         VectorMeasurementSchema vectorSchema =
             (VectorMeasurementSchema) insertTabletPlan.getMeasurementMNodes()[i].getSchema();
-        Object[] columns = new Object[vectorSchema.getValueMeasurementIdList().size()];
-        BitMap[] bitMaps = new BitMap[vectorSchema.getValueMeasurementIdList().size()];
-        for (int j = 0; j < vectorSchema.getValueMeasurementIdList().size(); j++) {
+        Object[] columns = new Object[vectorSchema.getSubMeasurementsList().size()];
+        BitMap[] bitMaps = new BitMap[vectorSchema.getSubMeasurementsList().size()];
+        for (int j = 0; j < vectorSchema.getSubMeasurementsList().size(); j++) {
           columns[j] = insertTabletPlan.getColumns()[columnIndex];
           if (insertTabletPlan.getBitMaps() != null) {
             bitMaps[j] = insertTabletPlan.getBitMaps()[columnIndex];
@@ -319,11 +319,11 @@ public abstract class AbstractMemTable implements IMemTable {
         return null;
       }
 
-      List<String> measurementIdList = partialVectorSchema.getValueMeasurementIdList();
+      List<String> measurementIdList = partialVectorSchema.getSubMeasurementsList();
       List<Integer> columns = new ArrayList<>();
       IMeasurementSchema vectorSchema = vectorMemChunk.getSchema();
       for (String queryingMeasurement : measurementIdList) {
-        columns.add(vectorSchema.getValueMeasurementIdList().indexOf(queryingMeasurement));
+        columns.add(vectorSchema.getSubMeasurementsList().indexOf(queryingMeasurement));
       }
       // get sorted tv list is synchronized so different query can get right sorted list reference
       TVList vectorTvListCopy = vectorMemChunk.getSortedTvListForQuery(columns);
@@ -374,7 +374,7 @@ public abstract class AbstractMemTable implements IMemTable {
       // for vector type
       else if (schema.getType() == TSDataType.VECTOR) {
         List<String> measurements = MetaUtils.getMeasurementsInPartialPath(originalPath);
-        if (measurements.containsAll(schema.getValueMeasurementIdList())) {
+        if (measurements.containsAll(schema.getSubMeasurementsList())) {
           if (startTimestamp == Long.MIN_VALUE && endTimestamp == Long.MAX_VALUE) {
             iter.remove();
           }
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/memtable/PrimitiveMemTable.java b/server/src/main/java/org/apache/iotdb/db/engine/memtable/PrimitiveMemTable.java
index e13bbf2..dc809e3 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/memtable/PrimitiveMemTable.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/memtable/PrimitiveMemTable.java
@@ -42,7 +42,7 @@ public class PrimitiveMemTable extends AbstractMemTable {
   protected IWritableMemChunk genMemSeries(IMeasurementSchema schema) {
     if (schema.getType() == TSDataType.VECTOR) {
       return new WritableMemChunk(
-          schema, TVListAllocator.getInstance().allocate(schema.getValueTSDataTypeList()));
+          schema, TVListAllocator.getInstance().allocate(schema.getSubMeasurementsTSDataTypeList()));
     }
     return new WritableMemChunk(schema, TVListAllocator.getInstance().allocate(schema.getType()));
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/querycontext/ReadOnlyMemChunk.java b/server/src/main/java/org/apache/iotdb/db/engine/querycontext/ReadOnlyMemChunk.java
index e7e83db..ebdf793 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/querycontext/ReadOnlyMemChunk.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/querycontext/ReadOnlyMemChunk.java
@@ -173,13 +173,13 @@ public class ReadOnlyMemChunk {
     IChunkMetadata timeChunkMetadata =
         new ChunkMetadata(measurementUid, TSDataType.VECTOR, 0, timeStatistics);
     List<IChunkMetadata> valueChunkMetadataList = new ArrayList<>();
-    Statistics[] valueStatistics = new Statistics[schema.getValueTSDataTypeList().size()];
-    for (int i = 0; i < schema.getValueTSDataTypeList().size(); i++) {
-      valueStatistics[i] = Statistics.getStatsByType(schema.getValueTSDataTypeList().get(i));
+    Statistics[] valueStatistics = new Statistics[schema.getSubMeasurementsTSDataTypeList().size()];
+    for (int i = 0; i < schema.getSubMeasurementsTSDataTypeList().size(); i++) {
+      valueStatistics[i] = Statistics.getStatsByType(schema.getSubMeasurementsTSDataTypeList().get(i));
       IChunkMetadata valueChunkMetadata =
           new ChunkMetadata(
-              schema.getValueMeasurementIdList().get(i),
-              schema.getValueTSDataTypeList().get(i),
+              schema.getSubMeasurementsList().get(i),
+              schema.getSubMeasurementsTSDataTypeList().get(i),
               0,
               valueStatistics[i]);
       valueChunkMetadataList.add(valueChunkMetadata);
@@ -190,7 +190,7 @@ public class ReadOnlyMemChunk {
       while (iterator.hasNextTimeValuePair()) {
         TimeValuePair timeValuePair = iterator.nextTimeValuePair();
         timeStatistics.update(timeValuePair.getTimestamp());
-        if (schema.getValueTSDataTypeList().size() == 1) {
+        if (schema.getSubMeasurementsTSDataTypeList().size() == 1) {
           updateValueStatisticsForSingleColumn(schema, valueStatistics, timeValuePair);
         } else {
           updateValueStatistics(schema, valueStatistics, timeValuePair);
@@ -212,7 +212,7 @@ public class ReadOnlyMemChunk {
   private void updateValueStatisticsForSingleColumn(
       IMeasurementSchema schema, Statistics[] valueStatistics, TimeValuePair timeValuePair)
       throws QueryProcessException {
-    switch (schema.getValueTSDataTypeList().get(0)) {
+    switch (schema.getSubMeasurementsTSDataTypeList().get(0)) {
       case BOOLEAN:
         valueStatistics[0].update(
             timeValuePair.getTimestamp(), timeValuePair.getValue().getBoolean());
@@ -243,11 +243,11 @@ public class ReadOnlyMemChunk {
   private void updateValueStatistics(
       IMeasurementSchema schema, Statistics[] valueStatistics, TimeValuePair timeValuePair)
       throws QueryProcessException {
-    for (int i = 0; i < schema.getValueTSDataTypeList().size(); i++) {
+    for (int i = 0; i < schema.getSubMeasurementsTSDataTypeList().size(); i++) {
       if (timeValuePair.getValue().getVector()[i] == null) {
         continue;
       }
-      switch (schema.getValueTSDataTypeList().get(i)) {
+      switch (schema.getSubMeasurementsTSDataTypeList().get(i)) {
         case BOOLEAN:
           valueStatistics[i].update(
               timeValuePair.getTimestamp(), timeValuePair.getValue().getVector()[i].getBoolean());
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
index 2b2185d..d86b74b 100755
--- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
@@ -1060,7 +1060,7 @@ public class StorageGroupProcessor {
     for (int i = 0; i < mNodes.length; i++) {
       // Don't update cached last value for vector type
       if (mNodes[i] != null && plan.isAligned()) {
-        columnIndex += mNodes[i].getSchema().getValueMeasurementIdList().size();
+        columnIndex += mNodes[i].getSchema().getSubMeasurementsList().size();
       } else {
         if (plan.getColumns()[i] == null) {
           columnIndex++;
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
index 28f0f6e..9d401b5 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
@@ -321,11 +321,11 @@ public class TsFileProcessor {
         IMeasurementSchema schema = insertRowPlan.getMeasurementMNodes()[i].getSchema();
         if (schema.getType() == TSDataType.VECTOR) {
           chunkMetadataIncrement +=
-              schema.getValueTSDataTypeList().size()
+              schema.getSubMeasurementsTSDataTypeList().size()
                   * ChunkMetadata.calculateRamSize(
-                      schema.getValueMeasurementIdList().get(0),
-                      schema.getValueTSDataTypeList().get(0));
-          memTableIncrement += TVList.vectorTvListArrayMemSize(schema.getValueTSDataTypeList());
+                      schema.getSubMeasurementsList().get(0),
+                      schema.getSubMeasurementsTSDataTypeList().get(0));
+          memTableIncrement += TVList.vectorTvListArrayMemSize(schema.getSubMeasurementsTSDataTypeList());
         } else {
           chunkMetadataIncrement +=
               ChunkMetadata.calculateRamSize(
@@ -365,8 +365,8 @@ public class TsFileProcessor {
       if (insertTabletPlan.isAligned()) {
         VectorMeasurementSchema vectorSchema =
             (VectorMeasurementSchema) insertTabletPlan.getMeasurementMNodes()[i].getSchema();
-        Object[] columns = new Object[vectorSchema.getValueMeasurementIdList().size()];
-        for (int j = 0; j < vectorSchema.getValueMeasurementIdList().size(); j++) {
+        Object[] columns = new Object[vectorSchema.getSubMeasurementsList().size()];
+        for (int j = 0; j < vectorSchema.getSubMeasurementsList().size(); j++) {
           columns[j] = insertTabletPlan.getColumns()[columnIndex++];
         }
         updateVectorMemCost(vectorSchema, deviceId, start, end, memIncrements, columns);
@@ -437,8 +437,8 @@ public class TsFileProcessor {
       Object[] columns) {
     // memIncrements = [memTable, text, chunk metadata] respectively
 
-    List<String> measurementIds = vectorSchema.getValueMeasurementIdList();
-    List<TSDataType> dataTypes = vectorSchema.getValueTSDataTypeList();
+    List<String> measurementIds = vectorSchema.getSubMeasurementsList();
+    List<TSDataType> dataTypes = vectorSchema.getSubMeasurementsTSDataTypeList();
     if (workMemTable.checkIfChunkDoesNotExist(deviceId, vectorSchema.getMeasurementId())) {
       // ChunkMetadataIncrement
       memIncrements[2] +=
@@ -1220,8 +1220,8 @@ public class TsFileProcessor {
         List<ChunkMetadata> timeChunkMetadataList =
             writer.getVisibleMetadataList(deviceId, measurementId, schema.getType());
         List<List<ChunkMetadata>> valueChunkMetadataList = new ArrayList<>();
-        List<String> valueMeasurementIdList = schema.getValueMeasurementIdList();
-        List<TSDataType> valueDataTypeList = schema.getValueTSDataTypeList();
+        List<String> valueMeasurementIdList = schema.getSubMeasurementsList();
+        List<TSDataType> valueDataTypeList = schema.getSubMeasurementsTSDataTypeList();
         for (int i = 0; i < valueMeasurementIdList.size(); i++) {
           valueChunkMetadataList.add(
               writer.getVisibleMetadataList(
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
index 3859995..30e49a4 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
@@ -593,7 +593,7 @@ public class MManager {
       if (lastNode instanceof MeasurementMNode) {
         IMeasurementSchema schema = ((MeasurementMNode) lastNode).getSchema();
         if (schema instanceof VectorMeasurementSchema) {
-          if (schema.getValueMeasurementIdList().size() != allTimeseries.size()) {
+          if (schema.getSubMeasurementsList().size() != allTimeseries.size()) {
             throw new AlignedTimeseriesException(
                 "Not support deleting part of aligned timeseies!", prefixPath.getFullPath());
           } else {
@@ -692,7 +692,7 @@ public class MManager {
       updateSchemaDataTypeNumMap(schema.getType(), -1);
       timeseriesNum = 1;
     } else if (schema instanceof VectorMeasurementSchema) {
-      for (TSDataType dataType : schema.getValueTSDataTypeList()) {
+      for (TSDataType dataType : schema.getSubMeasurementsTSDataTypeList()) {
         updateSchemaDataTypeNumMap(dataType, -1);
         timeseriesNum++;
       }
@@ -833,8 +833,10 @@ public class MManager {
     if (schema instanceof MeasurementSchema) {
       return schema.getType();
     } else {
-      List<String> measurements = schema.getValueMeasurementIdList();
-      return schema.getValueTSDataTypeList().get(measurements.indexOf(path.getMeasurement()));
+      List<String> measurements = schema.getSubMeasurementsList();
+      return schema
+          .getSubMeasurementsTSDataTypeList()
+          .get(measurements.indexOf(path.getMeasurement()));
     }
   }
 
@@ -1165,15 +1167,15 @@ public class MManager {
     if (schema == null || schema.getType() != TSDataType.VECTOR) {
       return schema;
     }
-    List<String> measurementsInLeaf = schema.getValueMeasurementIdList();
+    List<String> measurementsInLeaf = schema.getSubMeasurementsList();
     List<PartialPath> measurements = ((VectorPartialPath) fullPath).getSubSensorsPathList();
     TSDataType[] types = new TSDataType[measurements.size()];
     TSEncoding[] encodings = new TSEncoding[measurements.size()];
 
     for (int i = 0; i < measurements.size(); i++) {
       int index = measurementsInLeaf.indexOf(measurements.get(i).getMeasurement());
-      types[i] = schema.getValueTSDataTypeList().get(index);
-      encodings[i] = schema.getValueTSEncodingList().get(index);
+      types[i] = schema.getSubMeasurementsTSDataTypeList().get(index);
+      encodings[i] = schema.getSubMeasurementsTSEncodingList().get(index);
     }
     String[] array = new String[measurements.size()];
     for (int i = 0; i < array.length; i++) {
@@ -2221,7 +2223,7 @@ public class MManager {
         if (plan instanceof InsertRowPlan || plan instanceof InsertTabletPlan) {
           if (plan.isAligned()) {
             TSDataType dataTypeInNode =
-                measurementMNode.getSchema().getValueTSDataTypeList().get(i);
+                measurementMNode.getSchema().getSubMeasurementsTSDataTypeList().get(i);
             insertDataType = plan.getDataTypes()[i];
             if (insertDataType == null) {
               insertDataType = dataTypeInNode;
@@ -2229,7 +2231,7 @@ public class MManager {
             if (dataTypeInNode != insertDataType) {
               logger.warn(
                   "DataType mismatch, Insert measurement {} in {} type {}, metadata tree type {}",
-                  measurementMNode.getSchema().getValueMeasurementIdList().get(i),
+                  measurementMNode.getSchema().getSubMeasurementsList().get(i),
                   measurementList[i],
                   insertDataType,
                   dataTypeInNode);
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
index efb6d2e..379594c 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
@@ -1209,7 +1209,9 @@ public class MTree implements Serializable {
   }
 
   /**
-   * Iterate through MTree to fetch metadata info of all leaf nodes under the given seriesPath
+   * For show timeseries.
+   *
+   * <p>Iterate through MTree to fetch metadata info of all leaf nodes under the given seriesPath
    *
    * @param needLast if false, lastTimeStamp in timeseriesSchemaList will be null
    * @param timeseriesSchemaList List<timeseriesSchema> result: [name, alias, storage group,
@@ -1217,55 +1219,172 @@ public class MTree implements Serializable {
    */
   @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning
   private void findPath(
-      MNode node,
+      MNode curNode,
       String[] nodes,
-      int idx,
+      int childIndex,
       List<Pair<PartialPath, String[]>> timeseriesSchemaList,
       boolean hasLimit,
       boolean needLast,
       QueryContext queryContext,
       Template upperTemplate)
       throws MetadataException {
-    if (node instanceof MeasurementMNode
-        && (nodes.length <= idx
-            || ((MeasurementMNode) node).getSchema() instanceof VectorMeasurementSchema)) {
+    if (curNode instanceof MeasurementMNode
+        // For example: nodes: [root, sg, d1, s1, ss1], mtree: root.sg.d1.s1
+        // node: root.sg.d1.s1, idx = 4 < length, will not be chosen
+        && (nodes.length <= childIndex
+            || ((MeasurementMNode) curNode).getSchema() instanceof VectorMeasurementSchema)) {
+      MeasurementMNode measurementMNode = (MeasurementMNode) curNode;
+      timeseriesSchemaList.add(getTimeseriesInfo(measurementMNode, needLast, queryContext));
+
+      IMeasurementSchema measurementSchema = ((MeasurementMNode) curNode).getSchema();
+
+      if (measurementSchema instanceof MeasurementSchema) {
+
+      } else if (measurementSchema instanceof VectorMeasurementSchema) {
+        addVectorMeasurementSchema(
+            measurementMNode,
+            timeseriesSchemaList,
+            needLast,
+            queryContext,
+            measurementSchema,
+            MetaUtils.getNodeRegByIdx(childIndex, nodes));
+      }
       if (hasLimit) {
-        curOffset.set(curOffset.get() + 1);
-        if (curOffset.get() < offset.get() || count.get().intValue() == limit.get().intValue()) {
+        count.set(count.get() + 1);
+      }
+    }
+
+    String nodeReg = MetaUtils.getNodeRegByIdx(childIndex, nodes);
+    if (curNode.getDeviceTemplate() != null) {
+      upperTemplate = curNode.getDeviceTemplate();
+    }
+
+    // we should use template when all children are measurements or this node has no child
+    if (!nodeReg.contains(PATH_WILDCARD)) {
+      MNode next = curNode.getChild(nodeReg);
+      if (next != null) {
+        findPath(
+            next,
+            nodes,
+            childIndex + 1,
+            timeseriesSchemaList,
+            hasLimit,
+            needLast,
+            queryContext,
+            upperTemplate);
+      }
+    } else {
+      for (MNode child : curNode.getChildren().values()) {
+        if (!Pattern.matches(nodeReg.replace("*", ".*"), child.getName())) {
+          continue;
+        }
+        findPath(
+            child,
+            nodes,
+            childIndex + 1,
+            timeseriesSchemaList,
+            hasLimit,
+            needLast,
+            queryContext,
+            upperTemplate);
+        if (hasLimit && count.get().intValue() == limit.get().intValue()) {
           return;
         }
       }
-      IMeasurementSchema measurementSchema = ((MeasurementMNode) node).getSchema();
+    }
+
+    // template part
+    if (!(curNode instanceof MeasurementMNode) && curNode.isUseTemplate()) {
+      if (upperTemplate != null) {
+        HashSet<IMeasurementSchema> set = new HashSet<>();
+        for (IMeasurementSchema schema : upperTemplate.getSchemaMap().values()) {
+          if (set.add(schema)) {
+            if (schema instanceof MeasurementSchema) {
+              getMeasurementSchema(
+                  new MeasurementMNode(curNode, schema.getMeasurementId(), schema, null),
+                  timeseriesSchemaList,
+                  needLast,
+                  queryContext,
+                  schema,
+                  nodeReg);
+            } else if (schema instanceof VectorMeasurementSchema) {
+              VectorMeasurementSchema vectorMeasurementSchema = (VectorMeasurementSchema) schema;
+              if (Pattern.matches(
+                  nodeReg.replace("*", ".*"), vectorMeasurementSchema.getMeasurementId())) {
+                String firstNode = schema.getSubMeasurementsList().get(0);
+                addVectorMeasurementSchemaForTemplate(
+                    new MeasurementMNode(curNode, firstNode, schema, null),
+                    timeseriesSchemaList,
+                    needLast,
+                    queryContext,
+                    schema,
+                    MetaUtils.getNodeRegByIdx(childIndex + 1, nodes),
+                    vectorMeasurementSchema.getMeasurementId());
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * For query
+   *
+   * <p>Iterate through MTree to fetch metadata info of all leaf nodes under the given seriesPath
+   *
+   * @param needLast if false, lastTimeStamp in timeseriesSchemaList will be null
+   * @param timeseriesSchemaList List<timeseriesSchema> result: [name, alias, storage group,
+   *     dataType, encoding, compression, offset, lastTimeStamp]
+   */
+  @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning
+  private void findPath(
+      MNode curNode,
+      String[] nodes,
+      int childIndex,
+      List<Pair<PartialPath, String[]>> timeseriesSchemaList,
+      boolean hasLimit,
+      boolean needLast,
+      QueryContext queryContext,
+      Template upperTemplate)
+      throws MetadataException {
+    if (curNode instanceof MeasurementMNode
+        // For example: nodes: [root, sg, d1, s1, ss1], mtree: root.sg.d1.s1
+        // node: root.sg.d1.s1, idx = 4 < length, will not be chosen
+        && (nodes.length <= childIndex
+            || ((MeasurementMNode) curNode).getSchema() instanceof VectorMeasurementSchema)) {
+      MeasurementMNode measurementMNode = (MeasurementMNode) curNode;
+      IMeasurementSchema measurementSchema = ((MeasurementMNode) curNode).getSchema();
       if (measurementSchema instanceof MeasurementSchema) {
-        addMeasurementSchema(
-            node, timeseriesSchemaList, needLast, queryContext, measurementSchema, "*");
+        timeseriesSchemaList.add(
+            getTimeseriesInfo(measurementMNode, needLast, queryContext, measurementSchema));
       } else if (measurementSchema instanceof VectorMeasurementSchema) {
         addVectorMeasurementSchema(
-            node,
+            measurementMNode,
             timeseriesSchemaList,
             needLast,
             queryContext,
             measurementSchema,
-            idx < nodes.length ? nodes[idx] : "*");
+            MetaUtils.getNodeRegByIdx(childIndex, nodes));
       }
       if (hasLimit) {
         count.set(count.get() + 1);
       }
     }
 
-    String nodeReg = MetaUtils.getNodeRegByIdx(idx, nodes);
-    if (node.getDeviceTemplate() != null) {
-      upperTemplate = node.getDeviceTemplate();
+    String nodeReg = MetaUtils.getNodeRegByIdx(childIndex, nodes);
+    if (curNode.getDeviceTemplate() != null) {
+      upperTemplate = curNode.getDeviceTemplate();
     }
 
-    // we should use template when all child is measurement or this node has no child
+    // we should use template when all children are measurements or this node has no child
     if (!nodeReg.contains(PATH_WILDCARD)) {
-      MNode next = node.getChild(nodeReg);
+      MNode next = curNode.getChild(nodeReg);
       if (next != null) {
         findPath(
             next,
             nodes,
-            idx + 1,
+            childIndex + 1,
             timeseriesSchemaList,
             hasLimit,
             needLast,
@@ -1273,14 +1392,14 @@ public class MTree implements Serializable {
             upperTemplate);
       }
     } else {
-      for (MNode child : node.getChildren().values()) {
+      for (MNode child : curNode.getChildren().values()) {
         if (!Pattern.matches(nodeReg.replace("*", ".*"), child.getName())) {
           continue;
         }
         findPath(
             child,
             nodes,
-            idx + 1,
+            childIndex + 1,
             timeseriesSchemaList,
             hasLimit,
             needLast,
@@ -1293,14 +1412,14 @@ public class MTree implements Serializable {
     }
 
     // template part
-    if (!(node instanceof MeasurementMNode) && node.isUseTemplate()) {
+    if (!(curNode instanceof MeasurementMNode) && curNode.isUseTemplate()) {
       if (upperTemplate != null) {
         HashSet<IMeasurementSchema> set = new HashSet<>();
         for (IMeasurementSchema schema : upperTemplate.getSchemaMap().values()) {
           if (set.add(schema)) {
             if (schema instanceof MeasurementSchema) {
-              addMeasurementSchema(
-                  new MeasurementMNode(node, schema.getMeasurementId(), schema, null),
+              getMeasurementSchema(
+                  new MeasurementMNode(curNode, schema.getMeasurementId(), schema, null),
                   timeseriesSchemaList,
                   needLast,
                   queryContext,
@@ -1310,14 +1429,14 @@ public class MTree implements Serializable {
               VectorMeasurementSchema vectorMeasurementSchema = (VectorMeasurementSchema) schema;
               if (Pattern.matches(
                   nodeReg.replace("*", ".*"), vectorMeasurementSchema.getMeasurementId())) {
-                String firstNode = schema.getValueMeasurementIdList().get(0);
+                String firstNode = schema.getSubMeasurementsList().get(0);
                 addVectorMeasurementSchemaForTemplate(
-                    new MeasurementMNode(node, firstNode, schema, null),
+                    new MeasurementMNode(curNode, firstNode, schema, null),
                     timeseriesSchemaList,
                     needLast,
                     queryContext,
                     schema,
-                    MetaUtils.getNodeRegByIdx(idx + 1, nodes),
+                    MetaUtils.getNodeRegByIdx(childIndex + 1, nodes),
                     vectorMeasurementSchema.getMeasurementId());
               }
             }
@@ -1327,55 +1446,55 @@ public class MTree implements Serializable {
     }
   }
 
-  private void addMeasurementSchema(
-      MNode node,
-      List<Pair<PartialPath, String[]>> timeseriesSchemaList,
-      boolean needLast,
-      QueryContext queryContext,
-      IMeasurementSchema measurementSchema,
-      String reg)
+  /** For show timeseries */
+  private String[] getTimeseriesInfo(
+      MeasurementMNode node, boolean needLast, QueryContext queryContext)
       throws StorageGroupNotSetException {
-    if (Pattern.matches(reg.replace("*", ".*"), measurementSchema.getMeasurementId())) {
-      PartialPath nodePath = node.getPartialPath();
-      String[] tsRow = new String[7];
-      tsRow[0] = ((MeasurementMNode) node).getAlias();
-      tsRow[1] = getStorageGroupPath(nodePath).getFullPath();
-      tsRow[2] = measurementSchema.getType().toString();
-      tsRow[3] = measurementSchema.getEncodingType().toString();
-      tsRow[4] = measurementSchema.getCompressor().toString();
-      tsRow[5] = String.valueOf(((MeasurementMNode) node).getOffset());
-      tsRow[6] =
-          needLast ? String.valueOf(getLastTimeStamp((MeasurementMNode) node, queryContext)) : null;
-      Pair<PartialPath, String[]> temp = new Pair<>(nodePath, tsRow);
-      timeseriesSchemaList.add(temp);
-    }
+    MeasurementSchema measurementSchema = (MeasurementSchema) node.getSchema();
+    if (measurementSchema instanceof VectorMeasurementSchema) {}
+
+    String[] tsRow = new String[7];
+    tsRow[0] = node.getAlias();
+    tsRow[1] = getStorageGroupPath(node.getPartialPath()).getFullPath();
+    tsRow[2] = measurementSchema.getType().toString();
+    tsRow[3] = measurementSchema.getEncodingType().toString();
+    tsRow[4] = measurementSchema.getCompressor().toString();
+    tsRow[5] = String.valueOf(node.getOffset());
+    tsRow[6] = needLast ? String.valueOf(getLastTimeStamp(node, queryContext)) : null;
+    return tsRow;
+  }
+
+  /** For query */
+  private List<PartialPath> getMeasurementPaths(MeasurementMNode node) {
+    List<PartialPath> pathArrayList = new ArrayList<>();
+    pathArrayList.add(node.getPartialPath());
+    return pathArrayList;
   }
 
   private void addVectorMeasurementSchema(
-      MNode node,
+      MeasurementMNode node,
       List<Pair<PartialPath, String[]>> timeseriesSchemaList,
       boolean needLast,
       QueryContext queryContext,
       IMeasurementSchema schema,
       String reg)
       throws StorageGroupNotSetException, IllegalPathException {
-    List<String> measurements = schema.getValueMeasurementIdList();
-    for (int i = 0; i < measurements.size(); i++) {
-      if (!Pattern.matches(reg.replace("*", ".*"), measurements.get(i))) {
+    List<String> subMeasurements = schema.getSubMeasurementsList();
+    for (int i = 0; i < subMeasurements.size(); i++) {
+      if (!Pattern.matches(reg.replace("*", ".*"), subMeasurements.get(i))) {
         continue;
       }
       PartialPath devicePath = node.getPartialPath();
       String[] tsRow = new String[7];
       tsRow[0] = null;
       tsRow[1] = getStorageGroupPath(devicePath).getFullPath();
-      tsRow[2] = schema.getValueTSDataTypeList().get(i).toString();
-      tsRow[3] = schema.getValueTSEncodingList().get(i).toString();
+      tsRow[2] = schema.getSubMeasurementsTSDataTypeList().get(i).toString();
+      tsRow[3] = schema.getSubMeasurementsTSEncodingList().get(i).toString();
       tsRow[4] = schema.getCompressor().toString();
       tsRow[5] = "-1";
-      tsRow[6] =
-          needLast ? String.valueOf(getLastTimeStamp((MeasurementMNode) node, queryContext)) : null;
+      tsRow[6] = needLast ? String.valueOf(getLastTimeStamp(node, queryContext)) : null;
       Pair<PartialPath, String[]> temp =
-          new Pair<>(new PartialPath(devicePath.getFullPath(), measurements.get(i)), tsRow);
+          new Pair<>(new PartialPath(devicePath.getFullPath(), subMeasurements.get(i)), tsRow);
       timeseriesSchemaList.add(temp);
     }
   }
@@ -1389,7 +1508,7 @@ public class MTree implements Serializable {
       String reg,
       String vectorId)
       throws StorageGroupNotSetException, IllegalPathException {
-    List<String> measurements = schema.getValueMeasurementIdList();
+    List<String> measurements = schema.getSubMeasurementsList();
     for (int i = 0; i < measurements.size(); i++) {
       if (!Pattern.matches(reg.replace("*", ".*"), measurements.get(i))) {
         continue;
@@ -1399,8 +1518,8 @@ public class MTree implements Serializable {
       String[] tsRow = new String[7];
       tsRow[0] = null;
       tsRow[1] = getStorageGroupPath(devicePath).getFullPath();
-      tsRow[2] = schema.getValueTSDataTypeList().get(i).toString();
-      tsRow[3] = schema.getValueTSEncodingList().get(i).toString();
+      tsRow[2] = schema.getSubMeasurementsTSDataTypeList().get(i).toString();
+      tsRow[3] = schema.getSubMeasurementsTSEncodingList().get(i).toString();
       tsRow[4] = schema.getCompressor().toString();
       tsRow[5] = "-1";
       tsRow[6] =
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/VectorPartialPath.java b/server/src/main/java/org/apache/iotdb/db/metadata/VectorPartialPath.java
index 65ef534..a16caf4 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/VectorPartialPath.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/VectorPartialPath.java
@@ -28,7 +28,6 @@ import java.util.Objects;
  * VectorPartialPath represents a vector's fullPath. It not only contains the full path of vector's
  * own name, but also has subSensorsPathList which contain all the fullPath of vector's sub sensors.
  * e.g. VectorPartialPath1(root.sg1.d1.vector1, [root.sg1.d1.vector1.s1, root.sg1.d1.vector1.s2])
- * VectorPartialPath2(root.sg1.d1.vector2, [root.sg1.d1.vector2.s1, root.sg1.d1.vector2.s2])
  */
 public class VectorPartialPath extends PartialPath {
 
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
index e2d309b..edda52d 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
@@ -201,8 +201,8 @@ public class MeasurementMNode extends MNode {
     if (schema instanceof MeasurementSchema) {
       return schema.getType();
     } else {
-      int index = schema.getMeasurementIdColumnIndex(measurementId);
-      return schema.getValueTSDataTypeList().get(index);
+      int index = schema.getSubMeasurementColumnIndex(measurementId);
+      return schema.getSubMeasurementsTSDataTypeList().get(index);
     }
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/template/Template.java b/server/src/main/java/org/apache/iotdb/db/metadata/template/Template.java
index 5a59c52..4c9384d 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/template/Template.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/template/Template.java
@@ -163,7 +163,7 @@ public class Template {
       if (schemaEntry.getValue() instanceof VectorMeasurementSchema) {
         VectorMeasurementSchema vectorMeasurementSchema =
             (VectorMeasurementSchema) schemaEntry.getValue();
-        res.put(schemaEntry.getKey(), vectorMeasurementSchema.getValueMeasurementIdList());
+        res.put(schemaEntry.getKey(), vectorMeasurementSchema.getSubMeasurementsList());
       } else {
         res.put(schemaEntry.getKey(), new ArrayList<>());
       }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java
index f2668d3..ce02133 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java
@@ -185,7 +185,7 @@ public class QueryOperator extends Operator {
         List<TSDataType> seriesTypes = generator.getSeriesTypes(filterPaths);
         HashMap<PartialPath, TSDataType> pathTSDataTypeHashMap = new HashMap<>();
         for (int i = 0; i < filterPaths.size(); i++) {
-          rawDataQueryPlan.addFilterPathInDeviceToMeasurements(filterPaths.get(i));
+          rawDataQueryPlan.addPathToDeviceToMeasurements(filterPaths.get(i));
           pathTSDataTypeHashMap.put(filterPaths.get(i), seriesTypes.get(i));
         }
         IExpression expression = filterOperator.transformToExpression(pathTSDataTypeHashMap);
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowPlan.java
index 6990fec..18d7c86 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertRowPlan.java
@@ -280,7 +280,7 @@ public class InsertRowPlan extends InsertPlan {
         }
         // for aligned timeseries
         else {
-          for (TSDataType dataType : measurementMNodes[i].getSchema().getValueTSDataTypeList()) {
+          for (TSDataType dataType : measurementMNodes[i].getSchema().getSubMeasurementsTSDataTypeList()) {
             dataTypes[columnIndex] = dataType;
             try {
               values[columnIndex] =
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/RawDataQueryPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/RawDataQueryPlan.java
index 43c474e..cbaa214 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/RawDataQueryPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/RawDataQueryPlan.java
@@ -167,7 +167,7 @@ public class RawDataQueryPlan extends QueryPlan {
     return deviceToMeasurements.getOrDefault(device, new HashSet<>());
   }
 
-  public void addFilterPathInDeviceToMeasurements(Path path) {
+  public void addPathToDeviceToMeasurements(Path path) {
     deviceToMeasurements
         .computeIfAbsent(path.getDevice(), key -> new HashSet<>())
         .add(path.getMeasurement());
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/MemUtils.java b/server/src/main/java/org/apache/iotdb/db/utils/MemUtils.java
index 667a984..564c39d 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/MemUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/MemUtils.java
@@ -112,7 +112,7 @@ public class MemUtils {
         // time and index column memSize
         memSize += (end - start) * (8L + 4L);
         // value columns memSize
-        for (TSDataType type : schema.getValueTSDataTypeList()) {
+        for (TSDataType type : schema.getSubMeasurementsTSDataTypeList()) {
           if (type == TSDataType.TEXT && addingTextDataSize) {
             for (int j = start; j < end; j++) {
               memSize += getBinarySize(((Binary[]) insertTabletPlan.getColumns()[columnCount])[j]);
diff --git a/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java b/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java
index 52fbd1f..8b4c452 100644
--- a/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java
+++ b/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java
@@ -199,7 +199,7 @@ public class LogReplayer {
                     + tPlan.getMeasurements()[i]));
         columnIndex++;
       } else if (tPlan.isAligned()) {
-        List<TSDataType> datatypes = mNodes[i].getSchema().getValueTSDataTypeList();
+        List<TSDataType> datatypes = mNodes[i].getSchema().getSubMeasurementsTSDataTypeList();
         for (int j = 0; j < datatypes.size(); j++) {
           if (tPlan.getDataTypes()[columnIndex] == null) {
             tPlan.getDataTypes()[columnIndex] = datatypes.get(j);
@@ -207,7 +207,7 @@ public class LogReplayer {
             tPlan.markFailedMeasurementInsertion(
                 i,
                 new DataTypeMismatchException(
-                    mNodes[i].getSchema().getValueMeasurementIdList().get(j),
+                    mNodes[i].getSchema().getSubMeasurementsList().get(j),
                     tPlan.getDataTypes()[columnIndex],
                     datatypes.get(j)));
           }
diff --git a/session/src/main/java/org/apache/iotdb/session/Session.java b/session/src/main/java/org/apache/iotdb/session/Session.java
index 447c2b5..6322499 100644
--- a/session/src/main/java/org/apache/iotdb/session/Session.java
+++ b/session/src/main/java/org/apache/iotdb/session/Session.java
@@ -1253,10 +1253,10 @@ public class Session {
       request.setIsAligned(true);
       IMeasurementSchema measurementSchema = tablet.getSchemas().get(0);
       request.setPrefixPath(tablet.prefixPath);
-      int measurementsSize = measurementSchema.getValueMeasurementIdList().size();
+      int measurementsSize = measurementSchema.getSubMeasurementsList().size();
       for (int i = 0; i < measurementsSize; i++) {
-        request.addToMeasurements(measurementSchema.getValueMeasurementIdList().get(i));
-        request.addToTypes(measurementSchema.getValueTSDataTypeList().get(i).ordinal());
+        request.addToMeasurements(measurementSchema.getSubMeasurementsList().get(i));
+        request.addToTypes(measurementSchema.getSubMeasurementsTSDataTypeList().get(i).ordinal());
       }
       request.setIsAligned(true);
     } else {
@@ -1666,10 +1666,10 @@ public class Session {
         }
         columnIndex++;
       } else {
-        int measurementSize = schema.getValueMeasurementIdList().size();
+        int measurementSize = schema.getSubMeasurementsList().size();
         for (int j = 0; j < measurementSize; j++) {
           tablet.values[columnIndex] =
-              sortList(tablet.values[columnIndex], schema.getValueTSDataTypeList().get(j), index);
+              sortList(tablet.values[columnIndex], schema.getSubMeasurementsTSDataTypeList().get(j), index);
           if (tablet.bitMaps != null && tablet.bitMaps[columnIndex] != null) {
             tablet.bitMaps[columnIndex] = sortBitMap(tablet.bitMaps[columnIndex], index);
           }
diff --git a/session/src/main/java/org/apache/iotdb/session/SessionUtils.java b/session/src/main/java/org/apache/iotdb/session/SessionUtils.java
index f028990..9705d7f 100644
--- a/session/src/main/java/org/apache/iotdb/session/SessionUtils.java
+++ b/session/src/main/java/org/apache/iotdb/session/SessionUtils.java
@@ -50,9 +50,9 @@ public class SessionUtils {
         getValueBufferOfDataType(schema.getType(), tablet, indexOfValues, valueBuffer);
         indexOfValues++;
       } else {
-        for (int j = 0; j < schema.getValueTSDataTypeList().size(); j++) {
+        for (int j = 0; j < schema.getSubMeasurementsTSDataTypeList().size(); j++) {
           getValueBufferOfDataType(
-              schema.getValueTSDataTypeList().get(j), tablet, indexOfValues, valueBuffer);
+              schema.getSubMeasurementsTSDataTypeList().get(j), tablet, indexOfValues, valueBuffer);
           indexOfValues++;
         }
       }
diff --git a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java
index 15bd740..c37b6ad 100644
--- a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java
+++ b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java
@@ -393,15 +393,15 @@ public class IoTDBSessionSimpleIT {
       int rowIndex = tablet.rowSize++;
       tablet.addTimestamp(rowIndex, timestamp);
       tablet.addValue(
-          schemaList.get(0).getValueMeasurementIdList().get(0),
+          schemaList.get(0).getSubMeasurementsList().get(0),
           rowIndex,
           new SecureRandom().nextLong());
       tablet.addValue(
-          schemaList.get(0).getValueMeasurementIdList().get(1),
+          schemaList.get(0).getSubMeasurementsList().get(1),
           rowIndex,
           new SecureRandom().nextInt());
       tablet.addValue(
-          schemaList.get(0).getValueMeasurementIdList().get(2), rowIndex, new Binary("test"));
+          schemaList.get(0).getSubMeasurementsList().get(2), rowIndex, new Binary("test"));
       timestamp++;
     }
 
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/VectorChunkWriterImpl.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/VectorChunkWriterImpl.java
index 8f1e907..3447560 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/VectorChunkWriterImpl.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/chunk/VectorChunkWriterImpl.java
@@ -44,10 +44,10 @@ public class VectorChunkWriterImpl implements IChunkWriter {
             schema.getTimeTSEncoding(),
             schema.getTimeEncoder());
 
-    List<String> valueMeasurementIdList = schema.getValueMeasurementIdList();
-    List<TSDataType> valueTSDataTypeList = schema.getValueTSDataTypeList();
-    List<TSEncoding> valueTSEncodingList = schema.getValueTSEncodingList();
-    List<Encoder> valueEncoderList = schema.getValueEncoderList();
+    List<String> valueMeasurementIdList = schema.getSubMeasurementsList();
+    List<TSDataType> valueTSDataTypeList = schema.getSubMeasurementsTSDataTypeList();
+    List<TSEncoding> valueTSEncodingList = schema.getSubMeasurementsTSEncodingList();
+    List<Encoder> valueEncoderList = schema.getSubMeasurementsEncoderList();
 
     valueChunkWriterList = new ArrayList<>(valueMeasurementIdList.size());
     for (int i = 0; i < valueMeasurementIdList.size(); i++) {
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/record/Tablet.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/record/Tablet.java
index 2c8d958..86eb0dd 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/record/Tablet.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/record/Tablet.java
@@ -98,7 +98,7 @@ public class Tablet {
     int indexInSchema = 0;
     for (IMeasurementSchema schema : schemas) {
       if (schema.getType() == TSDataType.VECTOR) {
-        for (String measurementId : schema.getValueMeasurementIdList()) {
+        for (String measurementId : schema.getSubMeasurementsList()) {
           measurementIndex.put(measurementId, indexInSchema);
         }
       } else {
@@ -124,8 +124,8 @@ public class Tablet {
     int indexOfSchema = measurementIndex.get(measurementId);
     IMeasurementSchema measurementSchema = schemas.get(indexOfSchema);
     if (measurementSchema.getType().equals(TSDataType.VECTOR)) {
-      int indexInVector = measurementSchema.getMeasurementIdColumnIndex(measurementId);
-      TSDataType dataType = measurementSchema.getValueTSDataTypeList().get(indexInVector);
+      int indexInVector = measurementSchema.getSubMeasurementColumnIndex(measurementId);
+      TSDataType dataType = measurementSchema.getSubMeasurementsTSDataTypeList().get(indexInVector);
       addValueOfDataType(dataType, rowIndex, indexInVector, value);
     } else {
       addValueOfDataType(measurementSchema.getType(), rowIndex, indexOfSchema, value);
@@ -210,7 +210,7 @@ public class Tablet {
     int valueColumnsSize = 0;
     for (IMeasurementSchema schema : schemas) {
       if (schema instanceof VectorMeasurementSchema) {
-        valueColumnsSize += schema.getValueMeasurementIdList().size();
+        valueColumnsSize += schema.getSubMeasurementsList().size();
       } else {
         valueColumnsSize++;
       }
@@ -231,8 +231,8 @@ public class Tablet {
   }
 
   private int buildVectorColumns(VectorMeasurementSchema schema, int idx) {
-    for (int i = 0; i < schema.getValueMeasurementIdList().size(); i++) {
-      TSDataType dataType = schema.getValueTSDataTypeList().get(i);
+    for (int i = 0; i < schema.getSubMeasurementsList().size(); i++) {
+      TSDataType dataType = schema.getSubMeasurementsTSDataTypeList().get(i);
       values[idx] = createValueColumnOfDataType(dataType);
       idx++;
     }
@@ -281,8 +281,8 @@ public class Tablet {
         valueOccupation += calOccupationOfOneColumn(schema.getType(), columnIndex);
         columnIndex++;
       } else {
-        for (int j = 0; j < schema.getValueTSDataTypeList().size(); j++) {
-          TSDataType dataType = schema.getValueTSDataTypeList().get(j);
+        for (int j = 0; j < schema.getSubMeasurementsTSDataTypeList().size(); j++) {
+          TSDataType dataType = schema.getSubMeasurementsTSDataTypeList().get(j);
           valueOccupation += calOccupationOfOneColumn(dataType, columnIndex);
           columnIndex++;
         }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/IMeasurementSchema.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/IMeasurementSchema.java
index fb3358d..8898bf1 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/IMeasurementSchema.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/IMeasurementSchema.java
@@ -49,15 +49,15 @@ public interface IMeasurementSchema {
 
   Map<String, String> getProps();
 
-  List<String> getValueMeasurementIdList();
+  List<String> getSubMeasurementsList();
 
-  List<TSDataType> getValueTSDataTypeList();
+  List<TSDataType> getSubMeasurementsTSDataTypeList();
 
-  List<TSEncoding> getValueTSEncodingList();
+  List<TSEncoding> getSubMeasurementsTSEncodingList();
 
-  List<Encoder> getValueEncoderList();
+  List<Encoder> getSubMeasurementsEncoderList();
 
-  int getMeasurementIdColumnIndex(String measurementId);
+  int getSubMeasurementColumnIndex(String measurementId);
 
   int serializeTo(ByteBuffer buffer);
 
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/MeasurementSchema.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/MeasurementSchema.java
index 4778ca6..26e6060 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/MeasurementSchema.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/MeasurementSchema.java
@@ -223,22 +223,22 @@ public class MeasurementSchema
   }
 
   @Override
-  public List<String> getValueMeasurementIdList() {
+  public List<String> getSubMeasurementsList() {
     throw new UnsupportedOperationException("unsupported method for MeasurementSchema");
   }
 
   @Override
-  public List<TSDataType> getValueTSDataTypeList() {
+  public List<TSDataType> getSubMeasurementsTSDataTypeList() {
     throw new UnsupportedOperationException("unsupported method for MeasurementSchema");
   }
 
   @Override
-  public List<TSEncoding> getValueTSEncodingList() {
+  public List<TSEncoding> getSubMeasurementsTSEncodingList() {
     throw new UnsupportedOperationException("unsupported method for MeasurementSchema");
   }
 
   @Override
-  public List<Encoder> getValueEncoderList() {
+  public List<Encoder> getSubMeasurementsEncoderList() {
     throw new UnsupportedOperationException("unsupported method for MeasurementSchema");
   }
 
@@ -393,7 +393,7 @@ public class MeasurementSchema
   }
 
   @Override
-  public int getMeasurementIdColumnIndex(String measurementId) {
+  public int getSubMeasurementColumnIndex(String measurementId) {
     return 0;
   }
 }
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/VectorMeasurementSchema.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/VectorMeasurementSchema.java
index f9eb2b6..480c94d 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/VectorMeasurementSchema.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/VectorMeasurementSchema.java
@@ -43,8 +43,8 @@ import java.util.Objects;
 public class VectorMeasurementSchema
     implements IMeasurementSchema, Comparable<VectorMeasurementSchema>, Serializable {
 
-  private String vectorMeausurementId;
-  private Map<String, Integer> measurementsToIndexMap;
+  private String vectorMeasurementId;
+  private Map<String, Integer> subMeasurementsIndexMap;
   private byte[] types;
   private byte[] encodings;
   private TSEncodingBuilder[] encodingConverters;
@@ -58,10 +58,10 @@ public class VectorMeasurementSchema
       TSDataType[] types,
       TSEncoding[] encodings,
       CompressionType compressionType) {
-    this.vectorMeausurementId = measurementId;
-    this.measurementsToIndexMap = new HashMap<>();
+    this.vectorMeasurementId = measurementId;
+    this.subMeasurementsIndexMap = new HashMap<>();
     for (int i = 0; i < measurements.length; i++) {
-      measurementsToIndexMap.put(measurements[i], i);
+      subMeasurementsIndexMap.put(measurements[i], i);
     }
     byte[] typesInByte = new byte[types.length];
     for (int i = 0; i < types.length; i++) {
@@ -79,10 +79,10 @@ public class VectorMeasurementSchema
   }
 
   public VectorMeasurementSchema(String measurementId, String[] measurements, TSDataType[] types) {
-    this.vectorMeausurementId = measurementId;
-    this.measurementsToIndexMap = new HashMap<>();
+    this.vectorMeasurementId = measurementId;
+    this.subMeasurementsIndexMap = new HashMap<>();
     for (int i = 0; i < measurements.length; i++) {
-      measurementsToIndexMap.put(measurements[i], i);
+      subMeasurementsIndexMap.put(measurements[i], i);
     }
     this.types = new byte[types.length];
     for (int i = 0; i < types.length; i++) {
@@ -111,7 +111,7 @@ public class VectorMeasurementSchema
 
   @Override
   public String getMeasurementId() {
-    return vectorMeausurementId;
+    return vectorMeasurementId;
   }
 
   @Override
@@ -159,16 +159,12 @@ public class VectorMeasurementSchema
   }
 
   @Override
-  public List<String> getValueMeasurementIdList() {
-    String[] measurements = new String[measurementsToIndexMap.size()];
-    for (Map.Entry<String, Integer> entry : measurementsToIndexMap.entrySet()) {
-      measurements[entry.getValue()] = entry.getKey();
-    }
-    return Arrays.asList(measurements);
+  public List<String> getSubMeasurementsList() {
+    return new ArrayList<>(subMeasurementsIndexMap.keySet());
   }
 
   @Override
-  public List<TSDataType> getValueTSDataTypeList() {
+  public List<TSDataType> getSubMeasurementsTSDataTypeList() {
     List<TSDataType> dataTypeList = new ArrayList<>();
     for (byte dataType : types) {
       dataTypeList.add(TSDataType.deserialize(dataType));
@@ -177,7 +173,7 @@ public class VectorMeasurementSchema
   }
 
   @Override
-  public List<TSEncoding> getValueTSEncodingList() {
+  public List<TSEncoding> getSubMeasurementsTSEncodingList() {
     List<TSEncoding> encodingList = new ArrayList<>();
     for (byte encoding : encodings) {
       encodingList.add(TSEncoding.deserialize(encoding));
@@ -186,7 +182,7 @@ public class VectorMeasurementSchema
   }
 
   @Override
-  public List<Encoder> getValueEncoderList() {
+  public List<Encoder> getSubMeasurementsEncoderList() {
     List<Encoder> encoderList = new ArrayList<>();
     for (int i = 0; i < encodings.length; i++) {
       TSEncoding encoding = TSEncoding.deserialize(encodings[i]);
@@ -202,17 +198,17 @@ public class VectorMeasurementSchema
   }
 
   @Override
-  public int getMeasurementIdColumnIndex(String measurementId) {
-    return measurementsToIndexMap.get(measurementId);
+  public int getSubMeasurementColumnIndex(String measurementId) {
+    return subMeasurementsIndexMap.get(measurementId);
   }
 
   @Override
   public int serializeTo(ByteBuffer buffer) {
     int byteLen = 0;
-    byteLen += ReadWriteIOUtils.write(vectorMeausurementId, buffer);
-    byteLen += ReadWriteIOUtils.write(measurementsToIndexMap.size(), buffer);
+    byteLen += ReadWriteIOUtils.write(vectorMeasurementId, buffer);
+    byteLen += ReadWriteIOUtils.write(subMeasurementsIndexMap.size(), buffer);
 
-    for (Map.Entry<String, Integer> entry : measurementsToIndexMap.entrySet()) {
+    for (Map.Entry<String, Integer> entry : subMeasurementsIndexMap.entrySet()) {
       byteLen += ReadWriteIOUtils.write(entry.getKey(), buffer);
       byteLen += ReadWriteIOUtils.write(entry.getValue(), buffer);
     }
@@ -230,10 +226,10 @@ public class VectorMeasurementSchema
   @Override
   public int serializeTo(OutputStream outputStream) throws IOException {
     int byteLen = 0;
-    byteLen += ReadWriteIOUtils.write(vectorMeausurementId, outputStream);
-    byteLen += ReadWriteIOUtils.write(measurementsToIndexMap.size(), outputStream);
+    byteLen += ReadWriteIOUtils.write(vectorMeasurementId, outputStream);
+    byteLen += ReadWriteIOUtils.write(subMeasurementsIndexMap.size(), outputStream);
 
-    for (Map.Entry<String, Integer> entry : measurementsToIndexMap.entrySet()) {
+    for (Map.Entry<String, Integer> entry : subMeasurementsIndexMap.entrySet()) {
       byteLen += ReadWriteIOUtils.write(entry.getKey(), outputStream);
       byteLen += ReadWriteIOUtils.write(entry.getValue(), outputStream);
     }
@@ -267,7 +263,7 @@ public class VectorMeasurementSchema
   public static VectorMeasurementSchema deserializeFrom(InputStream inputStream)
       throws IOException {
     VectorMeasurementSchema vectorMeasurementSchema = new VectorMeasurementSchema();
-    vectorMeasurementSchema.vectorMeausurementId = ReadWriteIOUtils.readString(inputStream);
+    vectorMeasurementSchema.vectorMeasurementId = ReadWriteIOUtils.readString(inputStream);
 
     int measurementSize = ReadWriteIOUtils.readInt(inputStream);
     Map<String, Integer> measurementsToIndexMap = new HashMap<>();
@@ -275,7 +271,7 @@ public class VectorMeasurementSchema
       measurementsToIndexMap.put(
           ReadWriteIOUtils.readString(inputStream), ReadWriteIOUtils.readInt(inputStream));
     }
-    vectorMeasurementSchema.measurementsToIndexMap = measurementsToIndexMap;
+    vectorMeasurementSchema.subMeasurementsIndexMap = measurementsToIndexMap;
 
     byte[] types = new byte[measurementSize];
     for (int i = 0; i < measurementSize; i++) {
@@ -295,14 +291,14 @@ public class VectorMeasurementSchema
 
   public static VectorMeasurementSchema deserializeFrom(ByteBuffer buffer) {
     VectorMeasurementSchema vectorMeasurementSchema = new VectorMeasurementSchema();
-    vectorMeasurementSchema.vectorMeausurementId = ReadWriteIOUtils.readString(buffer);
+    vectorMeasurementSchema.vectorMeasurementId = ReadWriteIOUtils.readString(buffer);
     int measurementSize = ReadWriteIOUtils.readInt(buffer);
     Map<String, Integer> measurementsToIndexMap = new HashMap<>();
     for (int i = 0; i < measurementSize; i++) {
       measurementsToIndexMap.put(
           ReadWriteIOUtils.readString(buffer), ReadWriteIOUtils.readInt(buffer));
     }
-    vectorMeasurementSchema.measurementsToIndexMap = measurementsToIndexMap;
+    vectorMeasurementSchema.subMeasurementsIndexMap = measurementsToIndexMap;
 
     byte[] types = new byte[measurementSize];
     for (int i = 0; i < measurementSize; i++) {
@@ -331,13 +327,13 @@ public class VectorMeasurementSchema
     VectorMeasurementSchema that = (VectorMeasurementSchema) o;
     return Arrays.equals(types, that.types)
         && Arrays.equals(encodings, that.encodings)
-        && Objects.equals(vectorMeausurementId, that.vectorMeausurementId)
+        && Objects.equals(vectorMeasurementId, that.vectorMeasurementId)
         && Objects.equals(compressor, that.compressor);
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(vectorMeausurementId, types, encodings, compressor);
+    return Objects.hash(vectorMeasurementId, types, encodings, compressor);
   }
 
   /** compare by vector name */
@@ -346,16 +342,16 @@ public class VectorMeasurementSchema
     if (equals(o)) {
       return 0;
     } else {
-      return this.vectorMeausurementId.compareTo(o.vectorMeausurementId);
+      return this.vectorMeasurementId.compareTo(o.vectorMeasurementId);
     }
   }
 
   @Override
   public String toString() {
     StringContainer sc = new StringContainer("");
-    sc.addTail(vectorMeausurementId, ",");
+    sc.addTail(vectorMeasurementId, ",");
     // string is not in real order
-    for (Map.Entry<String, Integer> entry : measurementsToIndexMap.entrySet()) {
+    for (Map.Entry<String, Integer> entry : subMeasurementsIndexMap.entrySet()) {
       sc.addTail(
           "[",
           entry.getKey(),
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/VectorMeasurementSchemaStub.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/VectorMeasurementSchemaStub.java
index d4fbef2..4763f22 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/VectorMeasurementSchemaStub.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/VectorMeasurementSchemaStub.java
@@ -79,22 +79,22 @@ public class VectorMeasurementSchemaStub implements IMeasurementSchema {
   }
 
   @Override
-  public List<String> getValueMeasurementIdList() {
+  public List<String> getSubMeasurementsList() {
     return Arrays.asList("s1", "s2", "s3");
   }
 
   @Override
-  public List<TSDataType> getValueTSDataTypeList() {
+  public List<TSDataType> getSubMeasurementsTSDataTypeList() {
     return Arrays.asList(TSDataType.FLOAT, TSDataType.INT32, TSDataType.DOUBLE);
   }
 
   @Override
-  public List<TSEncoding> getValueTSEncodingList() {
+  public List<TSEncoding> getSubMeasurementsTSEncodingList() {
     return Arrays.asList(TSEncoding.PLAIN, TSEncoding.PLAIN, TSEncoding.PLAIN);
   }
 
   @Override
-  public List<Encoder> getValueEncoderList() {
+  public List<Encoder> getSubMeasurementsEncoderList() {
     return Arrays.asList(
         new PlainEncoder(TSDataType.FLOAT, 0),
         new PlainEncoder(TSDataType.INT32, 0),
@@ -122,7 +122,7 @@ public class VectorMeasurementSchemaStub implements IMeasurementSchema {
   }
 
   @Override
-  public int getMeasurementIdColumnIndex(String measurementId) {
+  public int getSubMeasurementColumnIndex(String measurementId) {
     return 0;
   }
 }