Skip to content

Commit 7136e6b

Browse files
committed
[opt](memo) reuse GroupPlan in Group to reduce memory usage
1 parent ecbc68d commit 7136e6b

9 files changed

Lines changed: 24 additions & 13 deletions

File tree

fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/HyperGraph.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -400,8 +400,9 @@ private Pair<BitSet, Long> buildForMv(Plan plan) {
400400
Group group = ((GroupPlan) plan).getGroup();
401401
GroupExpression groupExpression = group.getLogicalExpressions().get(0);
402402
return buildForMv(groupExpression.getPlan()
403-
.withChildren(
404-
groupExpression.children().stream().map(GroupPlan::new).collect(Collectors.toList())));
403+
.withChildren(groupExpression.children().stream()
404+
.map(Group::getGroupPlan)
405+
.collect(Collectors.toList())));
405406
}
406407
// process Project
407408
if (isValidProject(plan)) {

fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,8 @@ public boolean emitCsgCmp(long left, long right, List<JoinEdge> edges) {
102102
}
103103

104104
Memo memo = jobContext.getCascadesContext().getMemo();
105-
GroupPlan leftPlan = new GroupPlan(planTable.get(left));
106-
GroupPlan rightPlan = new GroupPlan(planTable.get(right));
105+
GroupPlan leftPlan = planTable.get(left).getGroupPlan();
106+
GroupPlan rightPlan = planTable.get(right).getGroupPlan();
107107

108108
// First, we implement all possible physical plans
109109
// In this step, we don't generate logical expression because they are useless in DPhyp.
@@ -205,7 +205,7 @@ private LogicalPlan proposeJoin(JoinType joinType, Plan left, Plan right, List<E
205205
public void addGroup(long bitmap, Group group) {
206206
Preconditions.checkArgument(LongBitmap.getCardinality(bitmap) == 1);
207207
usdEdges.put(bitmap, new BitSet());
208-
Plan plan = proposeProject(new GroupPlan(group), new ArrayList<>(), bitmap, bitmap);
208+
Plan plan = proposeProject(group.getGroupPlan(), new ArrayList<>(), bitmap, bitmap);
209209
if (!(plan instanceof GroupPlan)) {
210210
CopyInResult copyInResult = jobContext.getCascadesContext().getMemo().copyIn(plan, null, false, planTable);
211211
group = copyInResult.correspondingExpression.getOwnerGroup();

fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Group.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.doris.nereids.properties.LogicalProperties;
2323
import org.apache.doris.nereids.properties.PhysicalProperties;
2424
import org.apache.doris.nereids.trees.expressions.literal.Literal;
25+
import org.apache.doris.nereids.trees.plans.GroupPlan;
2526
import org.apache.doris.nereids.trees.plans.JoinType;
2627
import org.apache.doris.nereids.trees.plans.Plan;
2728
import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
@@ -60,6 +61,7 @@ public class Group {
6061
private final List<GroupExpression> logicalExpressions = Lists.newArrayList();
6162
private final List<GroupExpression> physicalExpressions = Lists.newArrayList();
6263
private final Map<GroupExpression, GroupExpression> enforcers = Maps.newHashMap();
64+
private final GroupPlan groupPlan;
6365
private boolean isStatsReliable = true;
6466
private LogicalProperties logicalProperties;
6567

@@ -89,6 +91,7 @@ public Group(GroupId groupId, GroupExpression groupExpression, LogicalProperties
8991
this.groupId = groupId;
9092
addGroupExpression(groupExpression);
9193
this.logicalProperties = logicalProperties;
94+
this.groupPlan = new GroupPlan(this);
9295
}
9396

9497
/**
@@ -99,6 +102,7 @@ public Group(GroupId groupId, GroupExpression groupExpression, LogicalProperties
99102
public Group(GroupId groupId, LogicalProperties logicalProperties) {
100103
this.groupId = groupId;
101104
this.logicalProperties = logicalProperties;
105+
this.groupPlan = new GroupPlan(this);
102106
}
103107

104108
public GroupId getGroupId() {
@@ -173,6 +177,10 @@ public List<GroupExpression> getPhysicalExpressions() {
173177
return physicalExpressions;
174178
}
175179

180+
public GroupPlan getGroupPlan() {
181+
return groupPlan;
182+
}
183+
176184
/**
177185
* Remove groupExpression from this group.
178186
*

fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ private Plan replaceChildrenToGroupPlan(Plan plan, List<Group> childrenGroups) {
746746

747747
ImmutableList.Builder<Plan> groupPlanChildren = ImmutableList.builderWithExpectedSize(childrenGroups.size());
748748
for (Group childrenGroup : childrenGroups) {
749-
groupPlanChildren.add(new GroupPlan(childrenGroup));
749+
groupPlanChildren.add(childrenGroup.getGroupPlan());
750750
}
751751
return plan.withChildren(groupPlanChildren.build());
752752
}

fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/GroupExpressionMatching.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import org.apache.doris.nereids.memo.Group;
2121
import org.apache.doris.nereids.memo.GroupExpression;
2222
import org.apache.doris.nereids.properties.LogicalProperties;
23-
import org.apache.doris.nereids.trees.plans.GroupPlan;
2423
import org.apache.doris.nereids.trees.plans.Plan;
2524

2625
import com.google.common.collect.ImmutableList;
@@ -111,7 +110,7 @@ public GroupExpressionIterator(Pattern<Plan> pattern, GroupExpression groupExpre
111110

112111
if (childrenPlan.isEmpty()) {
113112
if (pattern instanceof SubTreePattern) {
114-
childrenPlan = ImmutableList.of(new GroupPlan(childGroup));
113+
childrenPlan = ImmutableList.of(childGroup.getGroupPlan());
115114
} else {
116115
// current pattern is match but children patterns not match
117116
return;

fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/GroupMatching.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class GroupMatching {
3535
public static List<Plan> getAllMatchingPlans(Pattern pattern, Group group) {
3636
List<Plan> matchingPlans = new ArrayList<>();
3737
if (pattern.isGroup() || pattern.isMultiGroup()) {
38-
GroupPlan groupPlan = new GroupPlan(group);
38+
GroupPlan groupPlan = group.getGroupPlan();
3939
if (((Pattern<Plan>) pattern).matchPredicates(groupPlan)) {
4040
matchingPlans.add(groupPlan);
4141
}

fe/fe-core/src/main/java/org/apache/doris/nereids/properties/DistributionSpec.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public GroupExpression addEnforcer(Group child) {
4444
// If we don't set LogicalProperties explicitly, node will compute a applicable LogicalProperties for itself.
4545
PhysicalDistribute<GroupPlan> distribution = new PhysicalDistribute<>(
4646
this,
47-
new GroupPlan(child));
47+
child.getGroupPlan());
4848
return new GroupExpression(distribution, Lists.newArrayList(child));
4949
}
5050

fe/fe-core/src/main/java/org/apache/doris/nereids/properties/OrderSpec.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
import org.apache.doris.nereids.memo.Group;
2121
import org.apache.doris.nereids.memo.GroupExpression;
22-
import org.apache.doris.nereids.trees.plans.GroupPlan;
2322
import org.apache.doris.nereids.trees.plans.SortPhase;
2423
import org.apache.doris.nereids.trees.plans.physical.PhysicalQuickSort;
2524

@@ -67,7 +66,7 @@ public boolean satisfy(OrderSpec other) {
6766
public GroupExpression addLocalQuickSortEnforcer(Group child) {
6867
return new GroupExpression(
6968
new PhysicalQuickSort<>(orderKeys, SortPhase.LOCAL_SORT, child.getLogicalProperties(),
70-
new GroupPlan(child)),
69+
child.getGroupPlan()),
7170
Lists.newArrayList(child)
7271
);
7372
}
@@ -78,7 +77,7 @@ public GroupExpression addLocalQuickSortEnforcer(Group child) {
7877
public GroupExpression addGlobalQuickSortEnforcer(Group child) {
7978
return new GroupExpression(
8079
new PhysicalQuickSort<>(orderKeys, SortPhase.MERGE_SORT, child.getLogicalProperties(),
81-
new GroupPlan(child)),
80+
child.getGroupPlan()),
8281
Lists.newArrayList(child)
8382
);
8483
}

fe/fe-core/src/test/java/org/apache/doris/nereids/properties/ChildrenPropertiesRegulatorTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ public void testMustShuffleProject(Class<? extends Plan> childClazz,
100100
List<GroupExpression> children;
101101
Group childGroup = Mockito.mock(Group.class);
102102
Mockito.when(childGroup.getLogicalProperties()).thenReturn(Mockito.mock(LogicalProperties.class));
103+
GroupPlan childGroupPlan = new GroupPlan(childGroup);
104+
Mockito.when(childGroup.getGroupPlan()).thenReturn(childGroupPlan);
103105
GroupExpression child = Mockito.mock(GroupExpression.class);
104106
Mockito.when(child.getOutputProperties(Mockito.any())).thenReturn(PhysicalProperties.MUST_SHUFFLE);
105107
Mockito.when(child.getOwnerGroup()).thenReturn(childGroup);
@@ -159,6 +161,8 @@ private void testMustShuffleFilter(Class<? extends Plan> childClazz) {
159161
List<GroupExpression> children;
160162
Group childGroup = Mockito.mock(Group.class);
161163
Mockito.when(childGroup.getLogicalProperties()).thenReturn(Mockito.mock(LogicalProperties.class));
164+
GroupPlan childGroupPlan = new GroupPlan(childGroup);
165+
Mockito.when(childGroup.getGroupPlan()).thenReturn(childGroupPlan);
162166
GroupExpression child = Mockito.mock(GroupExpression.class);
163167
Mockito.when(child.getOutputProperties(Mockito.any())).thenReturn(PhysicalProperties.MUST_SHUFFLE);
164168
Mockito.when(child.getOwnerGroup()).thenReturn(childGroup);

0 commit comments

Comments
 (0)