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

morrysnow pushed a commit to branch mtmv_rewrite_performance
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/mtmv_rewrite_performance by 
this push:
     new 48b1ebdf92a [enhance](mtmv)When calculating whether partitions are 
synchronized, first filter based on the partitions used in the query (#48762)
48b1ebdf92a is described below

commit 48b1ebdf92a245bdb3b9537e39d9e047f7b93727
Author: zhangdong <zhangd...@selectdb.com>
AuthorDate: Tue Mar 25 11:08:44 2025 +0800

    [enhance](mtmv)When calculating whether partitions are synchronized, first 
filter based on the partitions used in the query (#48762)
---
 .../org/apache/doris/mtmv/MTMVRelationManager.java | 10 ++++--
 .../org/apache/doris/mtmv/MTMVRewriteUtil.java     | 38 +++++++++++++++++++++-
 .../org/apache/doris/mtmv/MTMVRewriteUtilTest.java | 24 +++++++-------
 3 files changed, 55 insertions(+), 17 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRelationManager.java 
b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRelationManager.java
index 5c48a2a982d..b69a18e774d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRelationManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRelationManager.java
@@ -84,13 +84,17 @@ public class MTMVRelationManager implements MTMVHookService 
{
             boolean forceConsistent, BiPredicate<ConnectContext, MTMV> 
predicate) {
         Set<MTMV> res = Sets.newLinkedHashSet();
         Set<BaseTableInfo> mvInfos = getMTMVInfos(tableInfos);
+        Map<List<String>, Set<String>> queryUsedPartitions = 
PartitionCompensator.getQueryUsedPartitions(ctx);
+
         for (BaseTableInfo tableInfo : mvInfos) {
             try {
                 MTMV mtmv = (MTMV) MTMVUtil.getTable(tableInfo);
                 if (predicate.test(ctx, mtmv)) {
                     continue;
                 }
-                if (isMVPartitionValid(mtmv, ctx, forceConsistent, 
PartitionCompensator.getQueryUsedPartitions(ctx))) {
+                BaseTableInfo relatedTableInfo = 
mtmv.getMvPartitionInfo().getRelatedTableInfo();
+                if (isMVPartitionValid(mtmv, ctx, forceConsistent,
+                        relatedTableInfo == null ? null : 
queryUsedPartitions.get(relatedTableInfo.toList()))) {
                     res.add(mtmv);
                 }
             } catch (Exception e) {
@@ -120,10 +124,10 @@ public class MTMVRelationManager implements 
MTMVHookService {
 
     @VisibleForTesting
     public boolean isMVPartitionValid(MTMV mtmv, ConnectContext ctx, boolean 
forceConsistent,
-            Map<List<String>, Set<String>> queryUsedRelatedTablePartitionsMap) 
{
+            Set<String> relatedPartitions) {
         long currentTimeMillis = System.currentTimeMillis();
         Collection<Partition> mtmvCanRewritePartitions = 
MTMVRewriteUtil.getMTMVCanRewritePartitions(
-                mtmv, ctx, currentTimeMillis, forceConsistent, 
queryUsedRelatedTablePartitionsMap);
+                mtmv, ctx, currentTimeMillis, forceConsistent, 
relatedPartitions);
         // MTMVRewriteUtil.getMTMVCanRewritePartitions is time-consuming 
behavior, So record for used later
         ctx.getStatementContext().getMvCanRewritePartitionsMap().putIfAbsent(
                 new BaseTableInfo(mtmv), mtmvCanRewritePartitions);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRewriteUtil.java 
b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRewriteUtil.java
index e1cb899c23c..f0ed6ccf93a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRewriteUtil.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRewriteUtil.java
@@ -25,6 +25,7 @@ import org.apache.doris.mtmv.MTMVRefreshEnum.MTMVState;
 import org.apache.doris.qe.ConnectContext;
 
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -32,6 +33,7 @@ import org.apache.logging.log4j.Logger;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 
 public class MTMVRewriteUtil {
@@ -46,7 +48,7 @@ public class MTMVRewriteUtil {
      */
     public static Collection<Partition> getMTMVCanRewritePartitions(MTMV mtmv, 
ConnectContext ctx,
             long currentTimeMills, boolean forceConsistent,
-            Map<List<String>, Set<String>> queryUsedRelatedTablePartitionsMap) 
{
+            Set<String> relatedPartitions) {
         List<Partition> res = Lists.newArrayList();
         Collection<Partition> allPartitions = mtmv.getPartitions();
         MTMVRelation mtmvRelation = mtmv.getRelation();
@@ -58,6 +60,10 @@ public class MTMVRewriteUtil {
         if (mtmvStatus.getState() != MTMVState.NORMAL || 
mtmvStatus.getRefreshState() == MTMVRefreshState.INIT) {
             return res;
         }
+        if (relatedPartitions != null && relatedPartitions.size() == 0) {
+            return res;
+        }
+        Set<String> mtmvNeedComparePartitions = null;
         MTMVRefreshContext refreshContext = null;
         // check gracePeriod
         long gracePeriodMills = mtmv.getGracePeriod();
@@ -76,6 +82,13 @@ public class MTMVRewriteUtil {
                     return res;
                 }
             }
+            if (mtmvNeedComparePartitions == null) {
+                mtmvNeedComparePartitions = 
getMtmvPartitionsByRelatedPartitions(mtmv, refreshContext,
+                        relatedPartitions);
+            }
+            if (!mtmvNeedComparePartitions.contains(partition.getName())) {
+                continue;
+            }
             try {
                 if (MTMVPartitionUtil.isMTMVPartitionSync(refreshContext, 
partition.getName(),
                         mtmvRelation.getBaseTablesOneLevel(),
@@ -89,4 +102,27 @@ public class MTMVRewriteUtil {
         }
         return res;
     }
+
+    private static Set<String> getMtmvPartitionsByRelatedPartitions(MTMV mtmv, 
MTMVRefreshContext refreshContext,
+            Set<String> relatedPartitions) {
+        if (relatedPartitions == null) {
+            return mtmv.getPartitionNames();
+        }
+        Set<String> res = Sets.newHashSet();
+        Map<String, String> relatedToMv = 
getRelatedToMv(refreshContext.getPartitionMappings());
+        for (String relatedPartition : relatedPartitions) {
+            res.add(relatedToMv.get(relatedPartition));
+        }
+        return res;
+    }
+
+    private static Map<String, String> getRelatedToMv(Map<String, Set<String>> 
mvToRelated) {
+        Map<String, String> res = Maps.newHashMap();
+        for (Entry<String, Set<String>> entry : mvToRelated.entrySet()) {
+            for (String relatedPartition : entry.getValue()) {
+                res.put(relatedPartition, entry.getKey());
+            }
+        }
+        return res;
+    }
 }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/mtmv/MTMVRewriteUtilTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/mtmv/MTMVRewriteUtilTest.java
index 6470b14f914..6ccdbbc4ab3 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/mtmv/MTMVRewriteUtilTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/mtmv/MTMVRewriteUtilTest.java
@@ -22,7 +22,6 @@ import org.apache.doris.catalog.Partition;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.mtmv.MTMVRefreshEnum.MTMVRefreshState;
 import org.apache.doris.mtmv.MTMVRefreshEnum.MTMVState;
-import org.apache.doris.nereids.rules.exploration.mv.PartitionCompensator;
 import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.qe.SessionVariable;
 
@@ -136,8 +135,7 @@ public class MTMVRewriteUtilTest {
         // currentTimeMills is 3, grace period is 2, and partition 
getVisibleVersionTime is 1
         // if forceConsistent this should get 0 partitions which mtmv can use.
         Collection<Partition> mtmvCanRewritePartitions = MTMVRewriteUtil
-                .getMTMVCanRewritePartitions(mtmv, ctx, currentTimeMills, true,
-                        PartitionCompensator.getQueryUsedPartitions(ctx));
+                .getMTMVCanRewritePartitions(mtmv, ctx, currentTimeMills, 
true, null);
         Assert.assertEquals(0, mtmvCanRewritePartitions.size());
     }
 
@@ -145,7 +143,7 @@ public class MTMVRewriteUtilTest {
     public void testGetMTMVCanRewritePartitionsNormal() {
         Collection<Partition> mtmvCanRewritePartitions = MTMVRewriteUtil
                 .getMTMVCanRewritePartitions(mtmv, ctx, currentTimeMills, 
false,
-                        PartitionCompensator.getQueryUsedPartitions(ctx));
+                        null);
         Assert.assertEquals(1, mtmvCanRewritePartitions.size());
     }
 
@@ -167,7 +165,7 @@ public class MTMVRewriteUtilTest {
 
         Collection<Partition> mtmvCanRewritePartitions = MTMVRewriteUtil
                 .getMTMVCanRewritePartitions(mtmv, ctx, currentTimeMills, 
false,
-                        PartitionCompensator.getQueryUsedPartitions(ctx));
+                        null);
         Assert.assertEquals(1, mtmvCanRewritePartitions.size());
     }
 
@@ -189,7 +187,7 @@ public class MTMVRewriteUtilTest {
 
         Collection<Partition> mtmvCanRewritePartitions = MTMVRewriteUtil
                 .getMTMVCanRewritePartitions(mtmv, ctx, currentTimeMills, 
false,
-                        PartitionCompensator.getQueryUsedPartitions(ctx));
+                        null);
         Assert.assertEquals(0, mtmvCanRewritePartitions.size());
     }
 
@@ -204,7 +202,7 @@ public class MTMVRewriteUtilTest {
         };
         Collection<Partition> mtmvCanRewritePartitions = MTMVRewriteUtil
                 .getMTMVCanRewritePartitions(mtmv, ctx, currentTimeMills, 
false,
-                        PartitionCompensator.getQueryUsedPartitions(ctx));
+                        null);
         // getMTMVCanRewritePartitions only check the partition is valid or 
not, it doesn't care the
         // isEnableMaterializedViewRewriteWhenBaseTableUnawareness
         Assert.assertEquals(1, mtmvCanRewritePartitions.size());
@@ -223,7 +221,7 @@ public class MTMVRewriteUtilTest {
         };
         Collection<Partition> mtmvCanRewritePartitions = MTMVRewriteUtil
                 .getMTMVCanRewritePartitions(mtmv, ctx, currentTimeMills, 
false,
-                        PartitionCompensator.getQueryUsedPartitions(ctx));
+                        null);
         Assert.assertEquals(0, mtmvCanRewritePartitions.size());
     }
 
@@ -242,7 +240,7 @@ public class MTMVRewriteUtilTest {
         };
         Collection<Partition> mtmvCanRewritePartitions = MTMVRewriteUtil
                 .getMTMVCanRewritePartitions(mtmv, ctx, currentTimeMills, 
false,
-                        PartitionCompensator.getQueryUsedPartitions(ctx));
+                        null);
         Assert.assertEquals(1, mtmvCanRewritePartitions.size());
     }
 
@@ -261,7 +259,7 @@ public class MTMVRewriteUtilTest {
         };
         Collection<Partition> mtmvCanRewritePartitions = MTMVRewriteUtil
                 .getMTMVCanRewritePartitions(mtmv, ctx, currentTimeMills, 
false,
-                        PartitionCompensator.getQueryUsedPartitions(ctx));
+                        null);
         // getMTMVCanRewritePartitions only check the partition is valid or 
not, it doesn't care the
         // isEnableMaterializedViewRewriteWhenBaseTableUnawareness
         Assert.assertEquals(1, mtmvCanRewritePartitions.size());
@@ -278,7 +276,7 @@ public class MTMVRewriteUtilTest {
         };
         Collection<Partition> mtmvCanRewritePartitions = MTMVRewriteUtil
                 .getMTMVCanRewritePartitions(mtmv, ctx, currentTimeMills, 
false,
-                        PartitionCompensator.getQueryUsedPartitions(ctx));
+                        null);
         Assert.assertEquals(0, mtmvCanRewritePartitions.size());
     }
 
@@ -293,7 +291,7 @@ public class MTMVRewriteUtilTest {
         };
         Collection<Partition> mtmvCanRewritePartitions = MTMVRewriteUtil
                 .getMTMVCanRewritePartitions(mtmv, ctx, currentTimeMills, 
false,
-                        PartitionCompensator.getQueryUsedPartitions(ctx));
+                        null);
         Assert.assertEquals(1, mtmvCanRewritePartitions.size());
     }
 
@@ -308,7 +306,7 @@ public class MTMVRewriteUtilTest {
         };
         Collection<Partition> mtmvCanRewritePartitions = MTMVRewriteUtil
                 .getMTMVCanRewritePartitions(mtmv, ctx, currentTimeMills, 
false,
-                        PartitionCompensator.getQueryUsedPartitions(ctx));
+                        null);
         Assert.assertEquals(0, mtmvCanRewritePartitions.size());
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to