You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by zy...@apache.org on 2023/05/31 18:08:22 UTC

[iotdb] branch master updated: Push down SchemaFilter processing to SchemaReader (#10005)

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

zyk 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 dd35304ede5 Push down SchemaFilter processing to SchemaReader (#10005)
dd35304ede5 is described below

commit dd35304ede56800cba742aeb9ecdf31d761cc0d8
Author: Chen YZ <43...@users.noreply.github.com>
AuthorDate: Thu Jun 1 02:08:15 2023 +0800

    Push down SchemaFilter processing to SchemaReader (#10005)
---
 .../commons/schema/view/LogicalViewSchema.java     |   7 +-
 .../db/metadata/mtree/MTreeBelowSGCachedImpl.java  | 101 ++++++-----
 .../db/metadata/mtree/MTreeBelowSGMemoryImpl.java  | 101 ++++++-----
 .../db/metadata/mtree/traverser/Traverser.java     |   7 -
 .../mtree/traverser/basic/EntityTraverser.java     |  31 +---
 .../traverser/basic/MeasurementTraverser.java      |  36 +---
 .../schemaregion/result/ShowTimeSeriesResult.java  |   5 +
 .../metadata/query/info/ITimeSeriesSchemaInfo.java |   2 +
 .../metadata/query/info/TimeseriesSchemaInfo.java  |  92 ++++++++++
 .../reader/TimeseriesReaderWithViewFetch.java      | 186 +++++++++++++++++++++
 .../db/metadata/visitor/DeviceFilterVisitor.java   |  40 +++++
 .../metadata/visitor/TimeseriesFilterVisitor.java  |  46 +++++
 .../operator/schema/SchemaQueryScanOperator.java   |   1 -
 .../operator/schema/source/DeviceSchemaSource.java |   5 -
 .../operator/schema/source/ISchemaSource.java      |  10 --
 .../schema/source/LogicalViewSchemaSource.java     | 122 ++------------
 .../operator/schema/source/NodeSchemaSource.java   |   5 -
 .../schema/source/PathsUsingTemplateSource.java    |   5 -
 .../schema/source/TimeSeriesSchemaSource.java      | 123 +-------------
 .../iotdb/db/rescon/PrimitiveArrayManager.java     |   2 +-
 .../db/metadata/idtable/entry/SchemaEntryTest.java |   2 +-
 .../tsfile/file/metadata/enums/TSDataType.java     |   7 +-
 22 files changed, 511 insertions(+), 425 deletions(-)

diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/schema/view/LogicalViewSchema.java b/node-commons/src/main/java/org/apache/iotdb/commons/schema/view/LogicalViewSchema.java
index b91b6f7963a..d13c5c0f28d 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/schema/view/LogicalViewSchema.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/schema/view/LogicalViewSchema.java
@@ -48,6 +48,8 @@ public class LogicalViewSchema
 
   private ViewExpression expression;
 
+  private TSDataType dataType = TSDataType.UNKNOWN;
+
   public LogicalViewSchema(String measurementId, ViewExpression expression) {
     this.measurementId = measurementId;
     this.expression = expression;
@@ -86,8 +88,7 @@ public class LogicalViewSchema
 
   @Override
   public TSDataType getType() {
-    // TODO: CRTODO: use a dynamic method to compute data type
-    return TSDataType.BOOLEAN;
+    return dataType;
   }
 
   @Override
@@ -97,7 +98,7 @@ public class LogicalViewSchema
 
   @Override
   public void setType(TSDataType dataType) {
-    // do nothing
+    this.dataType = dataType;
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java
index f558815258b..92400aa0563 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGCachedImpl.java
@@ -41,8 +41,6 @@ import org.apache.iotdb.db.metadata.MetadataConstant;
 import org.apache.iotdb.db.metadata.mnode.schemafile.ICachedMNode;
 import org.apache.iotdb.db.metadata.mnode.schemafile.factory.CacheMNodeFactory;
 import org.apache.iotdb.db.metadata.mtree.store.CachedMTreeStore;
-import org.apache.iotdb.db.metadata.mtree.traverser.Traverser;
-import org.apache.iotdb.db.metadata.mtree.traverser.TraverserWithLimitOffsetWrapper;
 import org.apache.iotdb.db.metadata.mtree.traverser.collector.EntityCollector;
 import org.apache.iotdb.db.metadata.mtree.traverser.collector.MNodeCollector;
 import org.apache.iotdb.db.metadata.mtree.traverser.collector.MeasurementCollector;
@@ -57,10 +55,14 @@ import org.apache.iotdb.db.metadata.plan.schemaregion.result.ShowNodesResult;
 import org.apache.iotdb.db.metadata.query.info.IDeviceSchemaInfo;
 import org.apache.iotdb.db.metadata.query.info.INodeSchemaInfo;
 import org.apache.iotdb.db.metadata.query.info.ITimeSeriesSchemaInfo;
+import org.apache.iotdb.db.metadata.query.info.TimeseriesSchemaInfo;
 import org.apache.iotdb.db.metadata.query.reader.ISchemaReader;
+import org.apache.iotdb.db.metadata.query.reader.SchemaReaderLimitOffsetWrapper;
+import org.apache.iotdb.db.metadata.query.reader.TimeseriesReaderWithViewFetch;
 import org.apache.iotdb.db.metadata.rescon.CachedSchemaRegionStatistics;
 import org.apache.iotdb.db.metadata.template.Template;
 import org.apache.iotdb.db.metadata.utils.MetaFormatUtils;
+import org.apache.iotdb.db.metadata.visitor.DeviceFilterVisitor;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
@@ -1028,32 +1030,46 @@ public class MTreeBelowSGCachedImpl {
     if (showDevicesPlan.usingSchemaTemplate()) {
       collector.setSchemaTemplateFilter(showDevicesPlan.getSchemaTemplateId());
     }
-    collector.setSchemaFilter(showDevicesPlan.getSchemaFilter());
-    TraverserWithLimitOffsetWrapper<IDeviceSchemaInfo, ICachedMNode> traverser =
-        new TraverserWithLimitOffsetWrapper<>(
-            collector, showDevicesPlan.getLimit(), showDevicesPlan.getOffset());
-    return new ISchemaReader<IDeviceSchemaInfo>() {
+    ISchemaReader<IDeviceSchemaInfo> reader =
+        new ISchemaReader<IDeviceSchemaInfo>() {
 
-      public boolean isSuccess() {
-        return traverser.isSuccess();
-      }
+          private final DeviceFilterVisitor filterVisitor = new DeviceFilterVisitor();
+          private IDeviceSchemaInfo next;
 
-      public Throwable getFailure() {
-        return traverser.getFailure();
-      }
+          public boolean isSuccess() {
+            return collector.isSuccess();
+          }
 
-      public void close() {
-        traverser.close();
-      }
+          public Throwable getFailure() {
+            return collector.getFailure();
+          }
 
-      public boolean hasNext() {
-        return traverser.hasNext();
-      }
+          public void close() {
+            collector.close();
+          }
 
-      public IDeviceSchemaInfo next() {
-        return traverser.next();
-      }
-    };
+          public boolean hasNext() {
+            while (next == null && collector.hasNext()) {
+              IDeviceSchemaInfo temp = collector.next();
+              if (filterVisitor.process(showDevicesPlan.getSchemaFilter(), temp)) {
+                next = temp;
+              }
+            }
+            return next != null;
+          }
+
+          public IDeviceSchemaInfo next() {
+            IDeviceSchemaInfo result = next;
+            next = null;
+            return result;
+          }
+        };
+    if (showDevicesPlan.getLimit() > 0 || showDevicesPlan.getOffset() > 0) {
+      return new SchemaReaderLimitOffsetWrapper<>(
+          reader, showDevicesPlan.getLimit(), showDevicesPlan.getOffset());
+    } else {
+      return reader;
+    }
   }
 
   public ISchemaReader<ITimeSeriesSchemaInfo> getTimeSeriesReader(
@@ -1107,42 +1123,25 @@ public class MTreeBelowSGCachedImpl {
               public PartialPath getPartialPath() {
                 return getPartialPathFromRootToNode(node.getAsMNode());
               }
+
+              @Override
+              public ITimeSeriesSchemaInfo snapshot() {
+                return new TimeseriesSchemaInfo(
+                    node, getPartialPath(), getTags(), getAttributes(), isUnderAlignedDevice());
+              }
             };
           }
         };
 
     collector.setTemplateMap(showTimeSeriesPlan.getRelatedTemplate(), nodeFactory);
-    collector.setSchemaFilter(showTimeSeriesPlan.getSchemaFilter());
-    Traverser<ITimeSeriesSchemaInfo, ICachedMNode> traverser;
+    ISchemaReader<ITimeSeriesSchemaInfo> reader =
+        new TimeseriesReaderWithViewFetch(collector, showTimeSeriesPlan.getSchemaFilter());
     if (showTimeSeriesPlan.getLimit() > 0 || showTimeSeriesPlan.getOffset() > 0) {
-      traverser =
-          new TraverserWithLimitOffsetWrapper<>(
-              collector, showTimeSeriesPlan.getLimit(), showTimeSeriesPlan.getOffset());
+      return new SchemaReaderLimitOffsetWrapper<>(
+          reader, showTimeSeriesPlan.getLimit(), showTimeSeriesPlan.getOffset());
     } else {
-      traverser = collector;
+      return reader;
     }
-    return new ISchemaReader<ITimeSeriesSchemaInfo>() {
-
-      public boolean isSuccess() {
-        return traverser.isSuccess();
-      }
-
-      public Throwable getFailure() {
-        return traverser.getFailure();
-      }
-
-      public void close() {
-        traverser.close();
-      }
-
-      public boolean hasNext() {
-        return traverser.hasNext();
-      }
-
-      public ITimeSeriesSchemaInfo next() {
-        return traverser.next();
-      }
-    };
   }
 
   public ISchemaReader<INodeSchemaInfo> getNodeReader(IShowNodesPlan showNodesPlan)
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
index 508825aca0d..9ff493f2ee4 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
@@ -46,8 +46,6 @@ import org.apache.iotdb.db.metadata.mnode.mem.IMemMNode;
 import org.apache.iotdb.db.metadata.mnode.mem.factory.MemMNodeFactory;
 import org.apache.iotdb.db.metadata.mnode.mem.info.LogicalViewInfo;
 import org.apache.iotdb.db.metadata.mtree.store.MemMTreeStore;
-import org.apache.iotdb.db.metadata.mtree.traverser.Traverser;
-import org.apache.iotdb.db.metadata.mtree.traverser.TraverserWithLimitOffsetWrapper;
 import org.apache.iotdb.db.metadata.mtree.traverser.collector.EntityCollector;
 import org.apache.iotdb.db.metadata.mtree.traverser.collector.MNodeCollector;
 import org.apache.iotdb.db.metadata.mtree.traverser.collector.MeasurementCollector;
@@ -62,10 +60,14 @@ import org.apache.iotdb.db.metadata.plan.schemaregion.result.ShowNodesResult;
 import org.apache.iotdb.db.metadata.query.info.IDeviceSchemaInfo;
 import org.apache.iotdb.db.metadata.query.info.INodeSchemaInfo;
 import org.apache.iotdb.db.metadata.query.info.ITimeSeriesSchemaInfo;
+import org.apache.iotdb.db.metadata.query.info.TimeseriesSchemaInfo;
 import org.apache.iotdb.db.metadata.query.reader.ISchemaReader;
+import org.apache.iotdb.db.metadata.query.reader.SchemaReaderLimitOffsetWrapper;
+import org.apache.iotdb.db.metadata.query.reader.TimeseriesReaderWithViewFetch;
 import org.apache.iotdb.db.metadata.rescon.MemSchemaRegionStatistics;
 import org.apache.iotdb.db.metadata.template.Template;
 import org.apache.iotdb.db.metadata.utils.MetaFormatUtils;
+import org.apache.iotdb.db.metadata.visitor.DeviceFilterVisitor;
 import org.apache.iotdb.db.quotas.DataNodeSpaceQuotaManager;
 import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
@@ -867,32 +869,46 @@ public class MTreeBelowSGMemoryImpl {
     if (showDevicesPlan.usingSchemaTemplate()) {
       collector.setSchemaTemplateFilter(showDevicesPlan.getSchemaTemplateId());
     }
-    collector.setSchemaFilter(showDevicesPlan.getSchemaFilter());
-    TraverserWithLimitOffsetWrapper<IDeviceSchemaInfo, IMemMNode> traverser =
-        new TraverserWithLimitOffsetWrapper<>(
-            collector, showDevicesPlan.getLimit(), showDevicesPlan.getOffset());
-    return new ISchemaReader<IDeviceSchemaInfo>() {
+    ISchemaReader<IDeviceSchemaInfo> reader =
+        new ISchemaReader<IDeviceSchemaInfo>() {
 
-      public boolean isSuccess() {
-        return traverser.isSuccess();
-      }
+          private final DeviceFilterVisitor filterVisitor = new DeviceFilterVisitor();
+          private IDeviceSchemaInfo next;
 
-      public Throwable getFailure() {
-        return traverser.getFailure();
-      }
+          public boolean isSuccess() {
+            return collector.isSuccess();
+          }
 
-      public void close() {
-        traverser.close();
-      }
+          public Throwable getFailure() {
+            return collector.getFailure();
+          }
 
-      public boolean hasNext() {
-        return traverser.hasNext();
-      }
+          public void close() {
+            collector.close();
+          }
 
-      public IDeviceSchemaInfo next() {
-        return traverser.next();
-      }
-    };
+          public boolean hasNext() {
+            while (next == null && collector.hasNext()) {
+              IDeviceSchemaInfo temp = collector.next();
+              if (filterVisitor.process(showDevicesPlan.getSchemaFilter(), temp)) {
+                next = temp;
+              }
+            }
+            return next != null;
+          }
+
+          public IDeviceSchemaInfo next() {
+            IDeviceSchemaInfo result = next;
+            next = null;
+            return result;
+          }
+        };
+    if (showDevicesPlan.getLimit() > 0 || showDevicesPlan.getOffset() > 0) {
+      return new SchemaReaderLimitOffsetWrapper<>(
+          reader, showDevicesPlan.getLimit(), showDevicesPlan.getOffset());
+    } else {
+      return reader;
+    }
   }
 
   public ISchemaReader<ITimeSeriesSchemaInfo> getTimeSeriesReader(
@@ -946,42 +962,25 @@ public class MTreeBelowSGMemoryImpl {
               public PartialPath getPartialPath() {
                 return getPartialPathFromRootToNode(node.getAsMNode());
               }
+
+              @Override
+              public ITimeSeriesSchemaInfo snapshot() {
+                return new TimeseriesSchemaInfo(
+                    node, getPartialPath(), getTags(), getAttributes(), isUnderAlignedDevice());
+              }
             };
           }
         };
 
-    collector.setSchemaFilter(showTimeSeriesPlan.getSchemaFilter());
     collector.setTemplateMap(showTimeSeriesPlan.getRelatedTemplate(), nodeFactory);
-    Traverser<ITimeSeriesSchemaInfo, IMemMNode> traverser;
+    ISchemaReader<ITimeSeriesSchemaInfo> reader =
+        new TimeseriesReaderWithViewFetch(collector, showTimeSeriesPlan.getSchemaFilter());
     if (showTimeSeriesPlan.getLimit() > 0 || showTimeSeriesPlan.getOffset() > 0) {
-      traverser =
-          new TraverserWithLimitOffsetWrapper<>(
-              collector, showTimeSeriesPlan.getLimit(), showTimeSeriesPlan.getOffset());
+      return new SchemaReaderLimitOffsetWrapper<>(
+          reader, showTimeSeriesPlan.getLimit(), showTimeSeriesPlan.getOffset());
     } else {
-      traverser = collector;
+      return reader;
     }
-    return new ISchemaReader<ITimeSeriesSchemaInfo>() {
-
-      public boolean isSuccess() {
-        return traverser.isSuccess();
-      }
-
-      public Throwable getFailure() {
-        return traverser.getFailure();
-      }
-
-      public void close() {
-        traverser.close();
-      }
-
-      public boolean hasNext() {
-        return traverser.hasNext();
-      }
-
-      public ITimeSeriesSchemaInfo next() {
-        return traverser.next();
-      }
-    };
   }
 
   public ISchemaReader<INodeSchemaInfo> getNodeReader(IShowNodesPlan showNodesPlan)
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/Traverser.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/Traverser.java
index c17320c1daa..9b66c9fb4ae 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/Traverser.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/Traverser.java
@@ -23,7 +23,6 @@ import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.path.fa.IFAState;
 import org.apache.iotdb.commons.path.fa.IFATransition;
-import org.apache.iotdb.commons.schema.filter.SchemaFilter;
 import org.apache.iotdb.commons.schema.node.IMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeIterator;
@@ -72,8 +71,6 @@ public abstract class Traverser<R, N extends IMNode<N>> extends AbstractTreeVisi
   // default false means fullPath pattern match
   protected boolean isPrefixMatch = false;
 
-  protected SchemaFilter schemaFilter;
-
   protected Traverser() {}
 
   /**
@@ -181,10 +178,6 @@ public abstract class Traverser<R, N extends IMNode<N>> extends AbstractTreeVisi
     this.nodeFactory = nodeFactory;
   }
 
-  public void setSchemaFilter(SchemaFilter schemaFilter) {
-    this.schemaFilter = schemaFilter;
-  }
-
   public void setSkipPreDeletedSchema(boolean skipPreDeletedSchema) {
     this.skipPreDeletedSchema = skipPreDeletedSchema;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/basic/EntityTraverser.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/basic/EntityTraverser.java
index fef5abe778a..92b2ab67ac6 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/basic/EntityTraverser.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/basic/EntityTraverser.java
@@ -18,23 +18,16 @@
  */
 package org.apache.iotdb.db.metadata.mtree.traverser.basic;
 
-import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.commons.schema.filter.SchemaFilter;
-import org.apache.iotdb.commons.schema.filter.SchemaFilterVisitor;
-import org.apache.iotdb.commons.schema.filter.impl.PathContainsFilter;
 import org.apache.iotdb.commons.schema.node.IMNode;
 import org.apache.iotdb.db.metadata.mtree.store.IMTreeStore;
 import org.apache.iotdb.db.metadata.mtree.traverser.Traverser;
 
-import org.apache.commons.lang.StringUtils;
-
 public abstract class EntityTraverser<R, N extends IMNode<N>> extends Traverser<R, N> {
 
   private boolean usingTemplate = false;
   private int schemaTemplateId = -1;
-  private final DeviceFilterVisitor filterVisitor = new DeviceFilterVisitor();
 
   /**
    * To traverse subtree under root.sg, e.g., init Traverser(root, "root.sg.**")
@@ -53,8 +46,7 @@ public abstract class EntityTraverser<R, N extends IMNode<N>> extends Traverser<
   @Override
   protected boolean mayTargetNodeType(N node) {
     if (node.isDevice()) {
-      return (!usingTemplate || schemaTemplateId == node.getAsDeviceMNode().getSchemaTemplateId())
-          && filterVisitor.process(schemaFilter, node);
+      return (!usingTemplate || schemaTemplateId == node.getAsDeviceMNode().getSchemaTemplateId());
     }
     return false;
   }
@@ -62,8 +54,7 @@ public abstract class EntityTraverser<R, N extends IMNode<N>> extends Traverser<
   @Override
   protected boolean acceptFullMatchedNode(N node) {
     if (node.isDevice()) {
-      return (!usingTemplate || schemaTemplateId == node.getAsDeviceMNode().getSchemaTemplateId())
-          && filterVisitor.process(schemaFilter, node);
+      return (!usingTemplate || schemaTemplateId == node.getAsDeviceMNode().getSchemaTemplateId());
     }
     return false;
   }
@@ -87,22 +78,4 @@ public abstract class EntityTraverser<R, N extends IMNode<N>> extends Traverser<
     this.usingTemplate = true;
     this.schemaTemplateId = schemaTemplateId;
   }
-
-  class DeviceFilterVisitor extends SchemaFilterVisitor<Boolean, N> {
-    @Override
-    public Boolean visitNode(SchemaFilter filter, N node) {
-      return true;
-    }
-
-    @Override
-    public Boolean visitPathContainsFilter(PathContainsFilter pathContainsFilter, N node) {
-      if (pathContainsFilter.getContainString() == null) {
-        return true;
-      }
-      return StringUtils.join(
-              getFullPathFromRootToNode(node.getAsMNode()), IoTDBConstant.PATH_SEPARATOR)
-          .toLowerCase()
-          .contains(pathContainsFilter.getContainString());
-    }
-  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/basic/MeasurementTraverser.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/basic/MeasurementTraverser.java
index 882852d052c..c2b7dff8359 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/basic/MeasurementTraverser.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/basic/MeasurementTraverser.java
@@ -18,23 +18,14 @@
  */
 package org.apache.iotdb.db.metadata.mtree.traverser.basic;
 
-import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.commons.schema.filter.SchemaFilter;
-import org.apache.iotdb.commons.schema.filter.SchemaFilterVisitor;
-import org.apache.iotdb.commons.schema.filter.impl.DataTypeFilter;
-import org.apache.iotdb.commons.schema.filter.impl.PathContainsFilter;
 import org.apache.iotdb.commons.schema.node.IMNode;
 import org.apache.iotdb.db.metadata.mtree.store.IMTreeStore;
 import org.apache.iotdb.db.metadata.mtree.traverser.Traverser;
 
-import org.apache.commons.lang.StringUtils;
-
 public abstract class MeasurementTraverser<R, N extends IMNode<N>> extends Traverser<R, N> {
 
-  private final MeasurementFilterVisitor filterVisitor = new MeasurementFilterVisitor();
-
   /**
    * To traverse subtree under root.sg, e.g., init Traverser(root, "root.sg.**")
    *
@@ -52,12 +43,12 @@ public abstract class MeasurementTraverser<R, N extends IMNode<N>> extends Trave
 
   @Override
   protected boolean mayTargetNodeType(N node) {
-    return node.isMeasurement() && filterVisitor.process(schemaFilter, node);
+    return node.isMeasurement();
   }
 
   @Override
   protected boolean acceptFullMatchedNode(N node) {
-    return node.isMeasurement() && filterVisitor.process(schemaFilter, node);
+    return node.isMeasurement();
   }
 
   @Override
@@ -74,27 +65,4 @@ public abstract class MeasurementTraverser<R, N extends IMNode<N>> extends Trave
   protected boolean shouldVisitSubtreeOfInternalMatchedNode(N node) {
     return !node.isMeasurement();
   }
-
-  class MeasurementFilterVisitor extends SchemaFilterVisitor<Boolean, N> {
-    @Override
-    public Boolean visitNode(SchemaFilter filter, N node) {
-      return true;
-    }
-
-    @Override
-    public Boolean visitPathContainsFilter(PathContainsFilter pathContainsFilter, N node) {
-      if (pathContainsFilter.getContainString() == null) {
-        return true;
-      }
-      return StringUtils.join(
-              getFullPathFromRootToNode(node.getAsMNode()), IoTDBConstant.PATH_SEPARATOR)
-          .toLowerCase()
-          .contains(pathContainsFilter.getContainString());
-    }
-
-    @Override
-    public Boolean visitDataTypeFilter(DataTypeFilter dataTypeFilter, N node) {
-      return node.getAsMeasurementMNode().getSchema().getType() == dataTypeFilter.getDataType();
-    }
-  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/result/ShowTimeSeriesResult.java b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/result/ShowTimeSeriesResult.java
index 6341c508507..b8e58fa2ff8 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/result/ShowTimeSeriesResult.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/plan/schemaregion/result/ShowTimeSeriesResult.java
@@ -86,6 +86,11 @@ public class ShowTimeSeriesResult extends ShowSchemaResult implements ITimeSerie
     return this.measurementSchema.isLogicalView();
   }
 
+  @Override
+  public ITimeSeriesSchemaInfo snapshot() {
+    return this;
+  }
+
   public TSDataType getDataType() {
     return measurementSchema.getType();
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/query/info/ITimeSeriesSchemaInfo.java b/server/src/main/java/org/apache/iotdb/db/metadata/query/info/ITimeSeriesSchemaInfo.java
index 577d5f49b33..1ca86c6d987 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/query/info/ITimeSeriesSchemaInfo.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/query/info/ITimeSeriesSchemaInfo.java
@@ -36,4 +36,6 @@ public interface ITimeSeriesSchemaInfo extends ISchemaInfo {
   boolean isUnderAlignedDevice();
 
   boolean isLogicalView();
+
+  ITimeSeriesSchemaInfo snapshot();
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/query/info/TimeseriesSchemaInfo.java b/server/src/main/java/org/apache/iotdb/db/metadata/query/info/TimeseriesSchemaInfo.java
new file mode 100644
index 00000000000..7bcb9892a74
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/query/info/TimeseriesSchemaInfo.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.metadata.query.info;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
+import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
+
+import java.util.Map;
+
+public class TimeseriesSchemaInfo implements ITimeSeriesSchemaInfo {
+
+  private final IMeasurementMNode<?> node;
+  private final PartialPath fullPath;
+  private final Map<String, String> tags;
+  private final Map<String, String> attributes;
+  private final boolean isUnderAlignedDevice;
+
+  public TimeseriesSchemaInfo(
+      IMeasurementMNode<?> node,
+      PartialPath fullPath,
+      Map<String, String> tags,
+      Map<String, String> attributes,
+      boolean isUnderAlignedDevice) {
+    this.node = node;
+    this.fullPath = fullPath;
+    this.tags = tags;
+    this.attributes = attributes;
+    this.isUnderAlignedDevice = isUnderAlignedDevice;
+  }
+
+  @Override
+  public String getFullPath() {
+    return fullPath.getFullPath();
+  }
+
+  @Override
+  public PartialPath getPartialPath() {
+    return fullPath;
+  }
+
+  @Override
+  public String getAlias() {
+    return node.getAlias();
+  }
+
+  @Override
+  public IMeasurementSchema getSchema() {
+    return node.getSchema();
+  }
+
+  @Override
+  public Map<String, String> getTags() {
+    return tags;
+  }
+
+  @Override
+  public Map<String, String> getAttributes() {
+    return attributes;
+  }
+
+  @Override
+  public boolean isUnderAlignedDevice() {
+    return isUnderAlignedDevice;
+  }
+
+  @Override
+  public boolean isLogicalView() {
+    return node.isLogicalView();
+  }
+
+  @Override
+  public ITimeSeriesSchemaInfo snapshot() {
+    return this;
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/query/reader/TimeseriesReaderWithViewFetch.java b/server/src/main/java/org/apache/iotdb/db/metadata/query/reader/TimeseriesReaderWithViewFetch.java
new file mode 100644
index 00000000000..c93d4daf74d
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/query/reader/TimeseriesReaderWithViewFetch.java
@@ -0,0 +1,186 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.metadata.query.reader;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.path.PathPatternTree;
+import org.apache.iotdb.commons.schema.filter.SchemaFilter;
+import org.apache.iotdb.commons.schema.view.LogicalViewSchema;
+import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
+import org.apache.iotdb.db.metadata.mtree.traverser.Traverser;
+import org.apache.iotdb.db.metadata.query.info.ITimeSeriesSchemaInfo;
+import org.apache.iotdb.db.metadata.view.viewExpression.visitor.GetSourcePathsVisitor;
+import org.apache.iotdb.db.metadata.view.viewExpression.visitor.TransformToExpressionVisitor;
+import org.apache.iotdb.db.metadata.visitor.TimeseriesFilterVisitor;
+import org.apache.iotdb.db.mpp.common.NodeRef;
+import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
+import org.apache.iotdb.db.mpp.plan.analyze.ExpressionTypeAnalyzer;
+import org.apache.iotdb.db.mpp.plan.analyze.schema.ClusterSchemaFetcher;
+import org.apache.iotdb.db.mpp.plan.expression.Expression;
+import org.apache.iotdb.db.mpp.plan.expression.visitor.CompleteMeasurementSchemaVisitor;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Queue;
+
+public class TimeseriesReaderWithViewFetch implements ISchemaReader<ITimeSeriesSchemaInfo> {
+
+  private final Traverser<ITimeSeriesSchemaInfo, ?> traverser;
+  private final Queue<ITimeSeriesSchemaInfo> cachedViewList = new ArrayDeque<>();
+  private ITimeSeriesSchemaInfo next = null;
+  private boolean consumeView = false;
+  private final SchemaFilter schemaFilter;
+
+  private static final int BATCH_CACHED_SIZE = 1000;
+  private static final TimeseriesFilterVisitor FILTER_VISITOR = new TimeseriesFilterVisitor();
+
+  public TimeseriesReaderWithViewFetch(
+      Traverser<ITimeSeriesSchemaInfo, ?> traverser, SchemaFilter schemaFilter) {
+    this.traverser = traverser;
+    this.schemaFilter = schemaFilter;
+  }
+
+  public boolean isSuccess() {
+    return traverser.isSuccess();
+  }
+
+  public Throwable getFailure() {
+    return traverser.getFailure();
+  }
+
+  public void close() {
+    traverser.close();
+  }
+
+  public boolean hasNext() {
+    if (next == null && !consumeView) {
+      fetchAndCacheNextResult();
+    }
+    if (consumeView) {
+      return !cachedViewList.isEmpty();
+    } else {
+      return next != null;
+    }
+  }
+
+  public ITimeSeriesSchemaInfo next() {
+    if (!hasNext()) {
+      throw new NoSuchElementException();
+    }
+    ITimeSeriesSchemaInfo result;
+    if (!consumeView) {
+      result = next;
+      next = null;
+    } else {
+      result = cachedViewList.poll();
+      consumeView = !cachedViewList.isEmpty();
+    }
+    return result;
+  }
+
+  /**
+   * Fetch ITimeSeriesSchemaInfo from the traverser and return only in the following three cases
+   *
+   * <ol>
+   *   <li>successfully fetched an info of normal time series. consumeView is false and next is not
+   *       null.
+   *   <li>successfully fetched batch info of view time series. consumeView is true and next is
+   *       null.
+   *   <li>no more info to be fetched. consumeView is false and next is null.
+   * </ol>
+   */
+  private void fetchAndCacheNextResult() {
+    ITimeSeriesSchemaInfo temp;
+    while (traverser.hasNext()) {
+      temp = traverser.next();
+      if (temp.isLogicalView()) {
+        cachedViewList.add(temp.snapshot());
+        if (cachedViewList.size() >= BATCH_CACHED_SIZE) {
+          fetchViewTimeSeriesSchemaInfo();
+          if (consumeView) {
+            break;
+          }
+        }
+      } else {
+        if (FILTER_VISITOR.process(schemaFilter, temp)) {
+          next = temp;
+          break;
+        }
+      }
+    }
+    if (next == null && !cachedViewList.isEmpty()) {
+      // all schema info has been fetched, but there mau be still some view schema info in
+      // cachedViewList
+      fetchViewTimeSeriesSchemaInfo();
+    }
+  }
+
+  private void fetchViewTimeSeriesSchemaInfo() {
+    List<ITimeSeriesSchemaInfo> delayedLogicalViewList = new ArrayList<>();
+    List<ViewExpression> viewExpressionList = new ArrayList<>();
+
+    GetSourcePathsVisitor getSourcePathsVisitor = new GetSourcePathsVisitor();
+    List<PartialPath> sourcePathsNeedFetch;
+    PathPatternTree patternTree = new PathPatternTree();
+    for (ITimeSeriesSchemaInfo series : cachedViewList) {
+      delayedLogicalViewList.add(series);
+      ViewExpression viewExpression = ((LogicalViewSchema) series.getSchema()).getExpression();
+      viewExpressionList.add(((LogicalViewSchema) series.getSchema()).getExpression());
+      sourcePathsNeedFetch = getSourcePathsVisitor.process(viewExpression, null);
+      for (PartialPath path : sourcePathsNeedFetch) {
+        patternTree.appendFullPath(path);
+      }
+    }
+    // clear cachedViewList, all cached view will be added in the last step
+    cachedViewList.clear();
+    ISchemaTree schemaTree = ClusterSchemaFetcher.getInstance().fetchSchema(patternTree, null);
+    // process each view expression and get data type
+    TransformToExpressionVisitor transformToExpressionVisitor = new TransformToExpressionVisitor();
+    CompleteMeasurementSchemaVisitor completeMeasurementSchemaVisitor =
+        new CompleteMeasurementSchemaVisitor();
+    Map<NodeRef<Expression>, TSDataType> expressionTypes = new HashMap<>();
+    for (int i = 0; i < delayedLogicalViewList.size(); i++) {
+      ViewExpression viewExpression = viewExpressionList.get(i);
+      Expression expression = null;
+      boolean viewIsBroken = false;
+      try {
+        expression = transformToExpressionVisitor.process(viewExpression, null);
+        expression = completeMeasurementSchemaVisitor.process(expression, schemaTree);
+        ExpressionTypeAnalyzer.analyzeExpression(expressionTypes, expression);
+      } catch (Exception e) {
+        viewIsBroken = true;
+      }
+      delayedLogicalViewList
+          .get(i)
+          .getSchema()
+          .setType(viewIsBroken ? TSDataType.UNKNOWN : expressionTypes.get(NodeRef.of(expression)));
+      if (FILTER_VISITOR.process(schemaFilter, delayedLogicalViewList.get(i))) {
+        cachedViewList.add(delayedLogicalViewList.get(i));
+      }
+    }
+    if (!cachedViewList.isEmpty()) {
+      consumeView = true;
+    }
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/visitor/DeviceFilterVisitor.java b/server/src/main/java/org/apache/iotdb/db/metadata/visitor/DeviceFilterVisitor.java
new file mode 100644
index 00000000000..09dd2848d88
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/visitor/DeviceFilterVisitor.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.metadata.visitor;
+
+import org.apache.iotdb.commons.schema.filter.SchemaFilter;
+import org.apache.iotdb.commons.schema.filter.SchemaFilterVisitor;
+import org.apache.iotdb.commons.schema.filter.impl.PathContainsFilter;
+import org.apache.iotdb.db.metadata.query.info.IDeviceSchemaInfo;
+
+public class DeviceFilterVisitor extends SchemaFilterVisitor<Boolean, IDeviceSchemaInfo> {
+  @Override
+  public Boolean visitNode(SchemaFilter filter, IDeviceSchemaInfo info) {
+    return true;
+  }
+
+  @Override
+  public Boolean visitPathContainsFilter(
+      PathContainsFilter pathContainsFilter, IDeviceSchemaInfo info) {
+    if (pathContainsFilter.getContainString() == null) {
+      return true;
+    }
+    return info.getFullPath().toLowerCase().contains(pathContainsFilter.getContainString());
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/visitor/TimeseriesFilterVisitor.java b/server/src/main/java/org/apache/iotdb/db/metadata/visitor/TimeseriesFilterVisitor.java
new file mode 100644
index 00000000000..743c209722d
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/visitor/TimeseriesFilterVisitor.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.metadata.visitor;
+
+import org.apache.iotdb.commons.schema.filter.SchemaFilter;
+import org.apache.iotdb.commons.schema.filter.SchemaFilterVisitor;
+import org.apache.iotdb.commons.schema.filter.impl.DataTypeFilter;
+import org.apache.iotdb.commons.schema.filter.impl.PathContainsFilter;
+import org.apache.iotdb.db.metadata.query.info.ITimeSeriesSchemaInfo;
+
+public class TimeseriesFilterVisitor extends SchemaFilterVisitor<Boolean, ITimeSeriesSchemaInfo> {
+  @Override
+  public Boolean visitNode(SchemaFilter filter, ITimeSeriesSchemaInfo info) {
+    return true;
+  }
+
+  @Override
+  public Boolean visitPathContainsFilter(
+      PathContainsFilter pathContainsFilter, ITimeSeriesSchemaInfo info) {
+    if (pathContainsFilter.getContainString() == null) {
+      return true;
+    }
+    return info.getFullPath().toLowerCase().contains(pathContainsFilter.getContainString());
+  }
+
+  @Override
+  public Boolean visitDataTypeFilter(DataTypeFilter dataTypeFilter, ITimeSeriesSchemaInfo info) {
+    return info.getSchema().getType() == dataTypeFilter.getDataType();
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaQueryScanOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaQueryScanOperator.java
index 55bf93932b5..d9879f511da 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaQueryScanOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/SchemaQueryScanOperator.java
@@ -142,7 +142,6 @@ public class SchemaQueryScanOperator<T extends ISchemaInfo> implements SourceOpe
     if (!schemaReader.isSuccess()) {
       throw new RuntimeException(schemaReader.getFailure());
     }
-    schemaSource.processDelayedTask(tsBlockBuilder, getDatabase());
     return tsBlockBuilder.build();
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/DeviceSchemaSource.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/DeviceSchemaSource.java
index 078df53450c..edc4cc3b82c 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/DeviceSchemaSource.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/DeviceSchemaSource.java
@@ -105,9 +105,4 @@ public class DeviceSchemaSource implements ISchemaSource<IDeviceSchemaInfo> {
   public long getSchemaStatistic(ISchemaRegion schemaRegion) {
     return schemaRegion.getSchemaRegionStatistics().getDevicesNumber();
   }
-
-  @Override
-  public void processDelayedTask(TsBlockBuilder tsBlockBuilder, String database) {
-    // There is no delayed tasks. So, do nothing.
-  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/ISchemaSource.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/ISchemaSource.java
index 45343a15839..d7a8cd73252 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/ISchemaSource.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/ISchemaSource.java
@@ -51,14 +51,4 @@ public interface ISchemaSource<T extends ISchemaInfo> {
   boolean hasSchemaStatistic(ISchemaRegion schemaRegion);
 
   long getSchemaStatistic(ISchemaRegion schemaRegion);
-
-  /**
-   * Some tasks may be delayed, and will be processed before building and returning of
-   * tsBlockBuilder. Those delayed tasks will be processed here. For example, in 'show timeseries'
-   * statement, tasks of processing series of views will be delayed. These tasks will be processed
-   * here, make counts of schema fetching come down.
-   *
-   * @param tsBlockBuilder complete delayed tasks on given tsBlock builder.
-   */
-  void processDelayedTask(TsBlockBuilder tsBlockBuilder, String database);
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/LogicalViewSchemaSource.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/LogicalViewSchemaSource.java
index d324452997a..1e1fc529987 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/LogicalViewSchemaSource.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/LogicalViewSchemaSource.java
@@ -21,32 +21,18 @@ package org.apache.iotdb.db.mpp.execution.operator.schema.source;
 
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.commons.path.PathPatternTree;
 import org.apache.iotdb.commons.schema.filter.SchemaFilter;
 import org.apache.iotdb.commons.schema.view.LogicalViewSchema;
-import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
 import org.apache.iotdb.db.metadata.plan.schemaregion.impl.read.SchemaRegionReadPlanFactory;
-import org.apache.iotdb.db.metadata.plan.schemaregion.result.ShowTimeSeriesResult;
 import org.apache.iotdb.db.metadata.query.info.ITimeSeriesSchemaInfo;
 import org.apache.iotdb.db.metadata.query.reader.ISchemaReader;
 import org.apache.iotdb.db.metadata.query.reader.SchemaReaderLimitOffsetWrapper;
 import org.apache.iotdb.db.metadata.schemaregion.ISchemaRegion;
-import org.apache.iotdb.db.metadata.view.viewExpression.visitor.GetSourcePathsVisitor;
-import org.apache.iotdb.db.metadata.view.viewExpression.visitor.TransformToExpressionVisitor;
-import org.apache.iotdb.db.mpp.common.NodeRef;
 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.schematree.ISchemaTree;
-import org.apache.iotdb.db.mpp.plan.analyze.ExpressionTypeAnalyzer;
-import org.apache.iotdb.db.mpp.plan.analyze.schema.ClusterSchemaFetcher;
-import org.apache.iotdb.db.mpp.plan.expression.Expression;
-import org.apache.iotdb.db.mpp.plan.expression.visitor.CompleteMeasurementSchemaVisitor;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 
-import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
@@ -62,15 +48,6 @@ public class LogicalViewSchemaSource implements ISchemaSource<ITimeSeriesSchemaI
   private final long offset;
 
   private final SchemaFilter schemaFilter;
-
-  /**
-   * The task of processing logical views will be delayed. Those infos will be stored here in
-   * function transformToTsBlockColumns(). <b>If there is no delayed infos of logical views, this
-   * variable may be null.</b>
-   */
-  private List<ITimeSeriesSchemaInfo> delayedLogicalViewList;
-
-  private static final String unknownDataTypeString = "UNKNOWN";
   private static final String viewTypeOfLogicalView = "logical";
 
   LogicalViewSchemaSource(
@@ -81,8 +58,6 @@ public class LogicalViewSchemaSource implements ISchemaSource<ITimeSeriesSchemaI
     this.offset = offset;
 
     this.schemaFilter = schemaFilter;
-
-    this.delayedLogicalViewList = new ArrayList<>();
   }
 
   @Override
@@ -108,20 +83,24 @@ public class LogicalViewSchemaSource implements ISchemaSource<ITimeSeriesSchemaI
   @Override
   public void transformToTsBlockColumns(
       ITimeSeriesSchemaInfo series, TsBlockBuilder builder, String database) {
-    // delay all tasks
-    this.delayedLogicalViewList.add(
-        new ShowTimeSeriesResult(
-            series.getFullPath(),
-            series.getAlias(),
-            series.getSchema(),
-            series.getTags(),
-            series.getAttributes(),
-            series.isUnderAlignedDevice()));
+    builder.getTimeColumnBuilder().writeLong(0);
+    builder.writeNullableText(0, series.getFullPath());
+    builder.writeNullableText(1, database);
+
+    builder.writeNullableText(2, series.getSchema().getType().toString());
+
+    builder.writeNullableText(3, mapToString(series.getTags()));
+    builder.writeNullableText(4, mapToString(series.getAttributes()));
+
+    builder.writeNullableText(5, viewTypeOfLogicalView);
+    builder.writeNullableText(
+        6, ((LogicalViewSchema) series.getSchema()).getExpression().toString());
+    builder.declarePosition();
   }
 
   @Override
   public boolean hasSchemaStatistic(ISchemaRegion schemaRegion) {
-    return pathPattern.equals(ALL_MATCH_PATTERN) && (schemaFilter == null);
+    return pathPattern.equals(ALL_MATCH_PATTERN);
   }
 
   @Override
@@ -129,78 +108,6 @@ public class LogicalViewSchemaSource implements ISchemaSource<ITimeSeriesSchemaI
     return schemaRegion.getSchemaRegionStatistics().getSeriesNumber();
   }
 
-  private List<String> analyzeDataTypeOfDelayedViews() {
-    if (this.delayedLogicalViewList == null || this.delayedLogicalViewList.size() <= 0) {
-      return new ArrayList<>();
-    }
-    // fetch schema of source paths of views
-    List<ViewExpression> viewExpressionList = new ArrayList<>();
-    for (ITimeSeriesSchemaInfo series : this.delayedLogicalViewList) {
-      viewExpressionList.add(((LogicalViewSchema) series.getSchema()).getExpression());
-    }
-    GetSourcePathsVisitor getSourcePathsVisitor = new GetSourcePathsVisitor();
-    List<PartialPath> sourcePathsNeedFetch;
-    PathPatternTree patternTree = new PathPatternTree();
-    for (ViewExpression viewExpression : viewExpressionList) {
-      sourcePathsNeedFetch = getSourcePathsVisitor.process(viewExpression, null);
-      for (PartialPath path : sourcePathsNeedFetch) {
-        patternTree.appendFullPath(path);
-      }
-    }
-    ISchemaTree schemaTree = ClusterSchemaFetcher.getInstance().fetchSchema(patternTree, null);
-    // process each view expression and get data type
-    TransformToExpressionVisitor transformToExpressionVisitor = new TransformToExpressionVisitor();
-    CompleteMeasurementSchemaVisitor completeMeasurementSchemaVisitor =
-        new CompleteMeasurementSchemaVisitor();
-    Map<NodeRef<Expression>, TSDataType> expressionTypes = new HashMap<>();
-    List<String> dataTypeStringList = new ArrayList<>();
-    for (ViewExpression viewExpression : viewExpressionList) {
-      Expression expression = null;
-      boolean viewIsBroken = false;
-      try {
-        expression = transformToExpressionVisitor.process(viewExpression, null);
-        expression = completeMeasurementSchemaVisitor.process(expression, schemaTree);
-        ExpressionTypeAnalyzer.analyzeExpression(expressionTypes, expression);
-      } catch (Exception e) {
-        viewIsBroken = true;
-      }
-      if (viewIsBroken) {
-        dataTypeStringList.add(unknownDataTypeString);
-      } else {
-        dataTypeStringList.add(expressionTypes.get(NodeRef.of(expression)).toString());
-      }
-    }
-    return dataTypeStringList;
-  }
-
-  @Override
-  public void processDelayedTask(TsBlockBuilder builder, String database) {
-    // There is no delayed tasks. So, do nothing.
-    if (this.delayedLogicalViewList == null || this.delayedLogicalViewList.size() <= 0) {
-      return;
-    }
-    List<String> dataTypeStringList = this.analyzeDataTypeOfDelayedViews();
-    // process delayed tasks
-    for (int index = 0; index < this.delayedLogicalViewList.size(); index++) {
-      ITimeSeriesSchemaInfo series = this.delayedLogicalViewList.get(index);
-      String expressionTypeOfThisView = dataTypeStringList.get(index);
-
-      builder.getTimeColumnBuilder().writeLong(0);
-      builder.writeNullableText(0, series.getFullPath());
-      builder.writeNullableText(1, database);
-
-      builder.writeNullableText(2, expressionTypeOfThisView);
-
-      builder.writeNullableText(3, mapToString(series.getTags()));
-      builder.writeNullableText(4, mapToString(series.getAttributes()));
-
-      builder.writeNullableText(5, viewTypeOfLogicalView);
-      builder.writeNullableText(
-          6, ((LogicalViewSchema) series.getSchema()).getExpression().toString());
-      builder.declarePosition();
-    }
-  }
-
   private String mapToString(Map<String, String> map) {
     if (map == null || map.isEmpty()) {
       return null;
@@ -212,6 +119,7 @@ public class LogicalViewSchemaSource implements ISchemaSource<ITimeSeriesSchemaI
     return "{" + content + "}";
   }
 
+  // TODO: this reader may be replaced by filter in the future
   private static class LogicalViewSchemaReader implements ISchemaReader<ITimeSeriesSchemaInfo> {
 
     private final ISchemaReader<ITimeSeriesSchemaInfo> timeSeriesReader;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/NodeSchemaSource.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/NodeSchemaSource.java
index 575da732333..78b4d8d18f5 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/NodeSchemaSource.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/NodeSchemaSource.java
@@ -88,9 +88,4 @@ public class NodeSchemaSource implements ISchemaSource<INodeSchemaInfo> {
   public long getSchemaStatistic(ISchemaRegion schemaRegion) {
     return 0;
   }
-
-  @Override
-  public void processDelayedTask(TsBlockBuilder tsBlockBuilder, String database) {
-    // There is no delayed tasks. So, do nothing.
-  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/PathsUsingTemplateSource.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/PathsUsingTemplateSource.java
index 27742499285..70e612d7573 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/PathsUsingTemplateSource.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/PathsUsingTemplateSource.java
@@ -71,11 +71,6 @@ public class PathsUsingTemplateSource implements ISchemaSource<IDeviceSchemaInfo
     return schemaRegion.getSchemaRegionStatistics().getTemplateActivatedNumber();
   }
 
-  @Override
-  public void processDelayedTask(TsBlockBuilder tsBlockBuilder, String database) {
-    // There is no delayed tasks. So, do nothing.
-  }
-
   private class DevicesUsingTemplateReader implements ISchemaReader<IDeviceSchemaInfo> {
 
     final Iterator<PartialPath> pathPatternIterator;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/TimeSeriesSchemaSource.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/TimeSeriesSchemaSource.java
index e4ef3e38900..d202e1e4c39 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/TimeSeriesSchemaSource.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/source/TimeSeriesSchemaSource.java
@@ -21,33 +21,18 @@ package org.apache.iotdb.db.mpp.execution.operator.schema.source;
 
 import org.apache.iotdb.commons.exception.MetadataException;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.commons.path.PathPatternTree;
 import org.apache.iotdb.commons.schema.filter.SchemaFilter;
-import org.apache.iotdb.commons.schema.view.LogicalViewSchema;
-import org.apache.iotdb.commons.schema.view.viewExpression.ViewExpression;
 import org.apache.iotdb.db.metadata.plan.schemaregion.impl.read.SchemaRegionReadPlanFactory;
-import org.apache.iotdb.db.metadata.plan.schemaregion.result.ShowTimeSeriesResult;
 import org.apache.iotdb.db.metadata.query.info.ITimeSeriesSchemaInfo;
 import org.apache.iotdb.db.metadata.query.reader.ISchemaReader;
 import org.apache.iotdb.db.metadata.schemaregion.ISchemaRegion;
 import org.apache.iotdb.db.metadata.template.Template;
 import org.apache.iotdb.db.metadata.utils.MetaUtils;
-import org.apache.iotdb.db.metadata.view.viewExpression.visitor.GetSourcePathsVisitor;
-import org.apache.iotdb.db.metadata.view.viewExpression.visitor.TransformToExpressionVisitor;
-import org.apache.iotdb.db.mpp.common.NodeRef;
 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.schematree.ISchemaTree;
-import org.apache.iotdb.db.mpp.plan.analyze.ExpressionTypeAnalyzer;
-import org.apache.iotdb.db.mpp.plan.analyze.schema.ClusterSchemaFetcher;
-import org.apache.iotdb.db.mpp.plan.expression.Expression;
-import org.apache.iotdb.db.mpp.plan.expression.visitor.CompleteMeasurementSchemaVisitor;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
 import org.apache.iotdb.tsfile.utils.Pair;
 
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -65,15 +50,6 @@ public class TimeSeriesSchemaSource implements ISchemaSource<ITimeSeriesSchemaIn
   private final SchemaFilter schemaFilter;
 
   private final Map<Integer, Template> templateMap;
-
-  /**
-   * The task of processing logical views will be delayed. Those infos will be stored here in
-   * function transformToTsBlockColumns(). <b>If there is no delayed infos of logical views, this
-   * variable may be null.</b>
-   */
-  private List<ITimeSeriesSchemaInfo> delayedLogicalViewList;
-
-  private static final String unknownDataTypeString = "UNKNOWN";
   private static final String viewTypeOfLogicalView = "logical";
   private static final String viewTypeOfNonView = "";
 
@@ -114,33 +90,25 @@ public class TimeSeriesSchemaSource implements ISchemaSource<ITimeSeriesSchemaIn
   @Override
   public void transformToTsBlockColumns(
       ITimeSeriesSchemaInfo series, TsBlockBuilder builder, String database) {
-    if (series.isLogicalView()) {
-      if (this.delayedLogicalViewList == null) {
-        this.delayedLogicalViewList = new ArrayList<>();
-      }
-      this.delayedLogicalViewList.add(
-          new ShowTimeSeriesResult(
-              series.getFullPath(),
-              series.getAlias(),
-              series.getSchema(),
-              series.getTags(),
-              series.getAttributes(),
-              series.isUnderAlignedDevice()));
-      return;
-    }
     Pair<String, String> deadbandInfo = MetaUtils.parseDeadbandInfo(series.getSchema().getProps());
     builder.getTimeColumnBuilder().writeLong(0);
     builder.writeNullableText(0, series.getFullPath());
     builder.writeNullableText(1, series.getAlias());
     builder.writeNullableText(2, database);
     builder.writeNullableText(3, series.getSchema().getType().toString());
-    builder.writeNullableText(4, series.getSchema().getEncodingType().toString());
-    builder.writeNullableText(5, series.getSchema().getCompressor().toString());
+    if (series.isLogicalView()) {
+      builder.writeNullableText(4, null);
+      builder.writeNullableText(5, null);
+      builder.writeNullableText(10, viewTypeOfLogicalView);
+    } else {
+      builder.writeNullableText(4, series.getSchema().getEncodingType().toString());
+      builder.writeNullableText(5, series.getSchema().getCompressor().toString());
+      builder.writeNullableText(10, viewTypeOfNonView);
+    }
     builder.writeNullableText(6, mapToString(series.getTags()));
     builder.writeNullableText(7, mapToString(series.getAttributes()));
     builder.writeNullableText(8, deadbandInfo.left);
     builder.writeNullableText(9, deadbandInfo.right);
-    builder.writeNullableText(10, viewTypeOfNonView);
     builder.declarePosition();
   }
 
@@ -154,79 +122,6 @@ public class TimeSeriesSchemaSource implements ISchemaSource<ITimeSeriesSchemaIn
     return schemaRegion.getSchemaRegionStatistics().getSeriesNumber();
   }
 
-  private List<String> analyzeDataTypeOfDelayedViews() {
-    if (this.delayedLogicalViewList == null || this.delayedLogicalViewList.size() <= 0) {
-      return new ArrayList<>();
-    }
-    // fetch schema of source paths of views
-    List<ViewExpression> viewExpressionList = new ArrayList<>();
-    for (ITimeSeriesSchemaInfo series : this.delayedLogicalViewList) {
-      viewExpressionList.add(((LogicalViewSchema) series.getSchema()).getExpression());
-    }
-    GetSourcePathsVisitor getSourcePathsVisitor = new GetSourcePathsVisitor();
-    List<PartialPath> sourcePathsNeedFetch;
-    PathPatternTree patternTree = new PathPatternTree();
-    for (ViewExpression viewExpression : viewExpressionList) {
-      sourcePathsNeedFetch = getSourcePathsVisitor.process(viewExpression, null);
-      for (PartialPath path : sourcePathsNeedFetch) {
-        patternTree.appendFullPath(path);
-      }
-    }
-    ISchemaTree schemaTree = ClusterSchemaFetcher.getInstance().fetchSchema(patternTree, null);
-    // process each view expression and get data type
-    TransformToExpressionVisitor transformToExpressionVisitor = new TransformToExpressionVisitor();
-    CompleteMeasurementSchemaVisitor completeMeasurementSchemaVisitor =
-        new CompleteMeasurementSchemaVisitor();
-    Map<NodeRef<Expression>, TSDataType> expressionTypes = new HashMap<>();
-    List<String> dataTypeStringList = new ArrayList<>();
-    for (ViewExpression viewExpression : viewExpressionList) {
-      Expression expression = null;
-      boolean viewIsBroken = false;
-      try {
-        expression = transformToExpressionVisitor.process(viewExpression, null);
-        expression = completeMeasurementSchemaVisitor.process(expression, schemaTree);
-        ExpressionTypeAnalyzer.analyzeExpression(expressionTypes, expression);
-      } catch (Exception e) {
-        viewIsBroken = true;
-      }
-      if (viewIsBroken) {
-        dataTypeStringList.add(unknownDataTypeString);
-      } else {
-        dataTypeStringList.add(expressionTypes.get(NodeRef.of(expression)).toString());
-      }
-    }
-    return dataTypeStringList;
-  }
-
-  @Override
-  public void processDelayedTask(TsBlockBuilder builder, String database) {
-    if (this.delayedLogicalViewList == null || this.delayedLogicalViewList.size() <= 0) {
-      return;
-    }
-    List<String> dataTypeStringList = this.analyzeDataTypeOfDelayedViews();
-    // process delayed tasks
-    for (int index = 0; index < this.delayedLogicalViewList.size(); index++) {
-      ITimeSeriesSchemaInfo series = this.delayedLogicalViewList.get(index);
-      String expressionTypeOfThisView = dataTypeStringList.get(index);
-
-      Pair<String, String> deadbandInfo =
-          MetaUtils.parseDeadbandInfo(series.getSchema().getProps());
-      builder.getTimeColumnBuilder().writeLong(0);
-      builder.writeNullableText(0, series.getFullPath());
-      builder.writeNullableText(1, series.getAlias());
-      builder.writeNullableText(2, database);
-      builder.writeNullableText(3, expressionTypeOfThisView);
-      builder.writeNullableText(4, null);
-      builder.writeNullableText(5, null);
-      builder.writeNullableText(6, mapToString(series.getTags()));
-      builder.writeNullableText(7, mapToString(series.getAttributes()));
-      builder.writeNullableText(8, deadbandInfo.left);
-      builder.writeNullableText(9, deadbandInfo.right);
-      builder.writeNullableText(10, viewTypeOfLogicalView);
-      builder.declarePosition();
-    }
-  }
-
   private String mapToString(Map<String, String> map) {
     if (map == null || map.isEmpty()) {
       return null;
diff --git a/server/src/main/java/org/apache/iotdb/db/rescon/PrimitiveArrayManager.java b/server/src/main/java/org/apache/iotdb/db/rescon/PrimitiveArrayManager.java
index d10c00cc06f..c0075afe2dd 100644
--- a/server/src/main/java/org/apache/iotdb/db/rescon/PrimitiveArrayManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/rescon/PrimitiveArrayManager.java
@@ -90,7 +90,7 @@ public class PrimitiveArrayManager {
     int totalDataTypeSize = 0;
     for (TSDataType dataType : TSDataType.values()) {
       // VECTOR is ignored
-      if (dataType.equals(TSDataType.VECTOR)) {
+      if (dataType.equals(TSDataType.VECTOR) || dataType.equals(TSDataType.UNKNOWN)) {
         continue;
       }
       totalDataTypeSize += dataType.getDataTypeSize();
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/idtable/entry/SchemaEntryTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/idtable/entry/SchemaEntryTest.java
index 630c7550ea7..21b0ccdad57 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/idtable/entry/SchemaEntryTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/idtable/entry/SchemaEntryTest.java
@@ -33,7 +33,7 @@ public class SchemaEntryTest {
   public void schemaEntryBuildTest() throws IllegalPathException {
     for (TSDataType type : TSDataType.values()) {
       // omit vector
-      if (type == TSDataType.VECTOR) {
+      if (type == TSDataType.VECTOR || type == TSDataType.UNKNOWN) {
         continue;
       }
 
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/enums/TSDataType.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/enums/TSDataType.java
index f4b88db27ca..583a6cd5a24 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/enums/TSDataType.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/file/metadata/enums/TSDataType.java
@@ -44,7 +44,10 @@ public enum TSDataType {
   TEXT((byte) 5),
 
   /** VECTOR */
-  VECTOR((byte) 6);
+  VECTOR((byte) 6),
+
+  /** UNKNOWN */
+  UNKNOWN((byte) 7);
 
   private final byte type;
 
@@ -82,6 +85,8 @@ public enum TSDataType {
         return TSDataType.TEXT;
       case 6:
         return TSDataType.VECTOR;
+      case 7:
+        return TSDataType.UNKNOWN;
       default:
         throw new IllegalArgumentException("Invalid input: " + type);
     }