[improvement](mtmv) Optimize the nested materialized view performance (#34163)
Record increase refersh version more accurately. The refreshVersion in the memo will increase when mv rewrite successfully. In query rewrite, if refresh version is different from the current struct info map in group, will refresh the group struct info or not.
This commit is contained in:
@ -416,7 +416,9 @@ public class Memo {
|
||||
throw new IllegalStateException("Insert a plan into targetGroup but differ in logicalproperties");
|
||||
}
|
||||
// TODO Support sync materialized view in the future
|
||||
if (plan instanceof CatalogRelation && ((CatalogRelation) plan).getTable() instanceof MTMV) {
|
||||
if (plan instanceof LogicalPlan && plan instanceof CatalogRelation
|
||||
&& ((CatalogRelation) plan).getTable() instanceof MTMV
|
||||
&& !plan.getGroupExpression().isPresent()) {
|
||||
refreshVersion.incrementAndGet();
|
||||
}
|
||||
Optional<GroupExpression> groupExpr = plan.getGroupExpression();
|
||||
|
||||
@ -59,7 +59,7 @@ public class StructInfoMap {
|
||||
return structInfo;
|
||||
}
|
||||
if (groupExpressionMap.isEmpty() || !groupExpressionMap.containsKey(tableMap)) {
|
||||
refresh(group, memo.getRefreshVersion(), foldTableMap);
|
||||
refresh(group, memo.getRefreshVersion());
|
||||
group.getstructInfoMap().setRefreshVersion(memo.getRefreshVersion());
|
||||
}
|
||||
if (groupExpressionMap.containsKey(tableMap)) {
|
||||
@ -118,7 +118,10 @@ public class StructInfoMap {
|
||||
* @param group the root group
|
||||
*
|
||||
*/
|
||||
public void refresh(Group group, long refreshVersion, BitSet targetBitSet) {
|
||||
public void refresh(Group group, long memoVersion) {
|
||||
if (memoVersion == group.getstructInfoMap().refreshVersion) {
|
||||
return;
|
||||
}
|
||||
Set<Integer> refreshedGroup = new HashSet<>();
|
||||
for (GroupExpression groupExpression : group.getLogicalExpressions()) {
|
||||
List<Set<BitSet>> childrenTableMap = new LinkedList<>();
|
||||
@ -129,10 +132,9 @@ public class StructInfoMap {
|
||||
}
|
||||
for (Group child : groupExpression.children()) {
|
||||
StructInfoMap childStructInfoMap = child.getstructInfoMap();
|
||||
if (!refreshedGroup.contains(child.getGroupId().asInt())
|
||||
&& refreshVersion != childStructInfoMap.getRefreshVersion()) {
|
||||
childStructInfoMap.refresh(child, refreshVersion, targetBitSet);
|
||||
childStructInfoMap.setRefreshVersion(refreshVersion);
|
||||
if (!refreshedGroup.contains(child.getGroupId().asInt())) {
|
||||
childStructInfoMap.refresh(child, memoVersion);
|
||||
childStructInfoMap.setRefreshVersion(memoVersion);
|
||||
}
|
||||
refreshedGroup.add(child.getGroupId().asInt());
|
||||
childrenTableMap.add(child.getstructInfoMap().getTableMaps());
|
||||
|
||||
@ -150,8 +150,7 @@ public class MaterializedViewUtils {
|
||||
StructInfoMap structInfoMap = ownerGroup.getstructInfoMap();
|
||||
if (cascadesContext.getMemo().getRefreshVersion() != structInfoMap.getRefreshVersion()
|
||||
|| structInfoMap.getTableMaps().isEmpty()) {
|
||||
structInfoMap.refresh(ownerGroup, cascadesContext.getMemo().getRefreshVersion(),
|
||||
materializedViewTableSet);
|
||||
structInfoMap.refresh(ownerGroup, cascadesContext.getMemo().getRefreshVersion());
|
||||
structInfoMap.setRefreshVersion(cascadesContext.getMemo().getRefreshVersion());
|
||||
}
|
||||
Set<BitSet> queryTableSets = structInfoMap.getTableMaps();
|
||||
|
||||
Reference in New Issue
Block a user