Skip to content

Commit 54d7ff2

Browse files
committed
[opt](memo) reduce memo size
1 parent 38e7ffd commit 54d7ff2

File tree

12 files changed

+88
-57
lines changed

12 files changed

+88
-57
lines changed

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

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@
1818
package org.apache.doris.nereids;
1919

2020
import org.apache.doris.nereids.memo.GroupExpression;
21+
import org.apache.doris.nereids.properties.DistributionSpecReplicated;
22+
import org.apache.doris.nereids.properties.PhysicalProperties;
2123
import org.apache.doris.nereids.trees.plans.Plan;
2224
import org.apache.doris.qe.ConnectContext;
2325
import org.apache.doris.qe.SessionVariable;
2426
import org.apache.doris.statistics.Statistics;
2527

26-
import java.util.ArrayList;
2728
import java.util.List;
2829

2930
/**
@@ -34,59 +35,49 @@
3435
*/
3536
public class PlanContext {
3637
private final ConnectContext connectContext;
37-
private final List<Statistics> childrenStats;
38-
private final Statistics planStats;
39-
private final int arity;
40-
private boolean isBroadcastJoin = false;
41-
private final boolean isStatsReliable;
38+
private final GroupExpression groupExpression;
39+
private final boolean isBroadcastJoin;
4240

4341
/**
4442
* Constructor for PlanContext.
4543
*/
46-
public PlanContext(ConnectContext connectContext, GroupExpression groupExpression) {
44+
public PlanContext(ConnectContext connectContext, GroupExpression groupExpression,
45+
List<PhysicalProperties> childrenProperties) {
4746
this.connectContext = connectContext;
48-
this.arity = groupExpression.arity();
49-
this.planStats = groupExpression.getOwnerGroup().getStatistics();
50-
this.isStatsReliable = groupExpression.getOwnerGroup().isStatsReliable();
51-
this.childrenStats = new ArrayList<>(groupExpression.arity());
52-
for (int i = 0; i < groupExpression.arity(); i++) {
53-
childrenStats.add(groupExpression.childStatistics(i));
47+
this.groupExpression = groupExpression;
48+
if (childrenProperties.size() >= 2
49+
&& childrenProperties.get(1).getDistributionSpec() instanceof DistributionSpecReplicated) {
50+
isBroadcastJoin = true;
51+
} else {
52+
isBroadcastJoin = false;
5453
}
5554
}
5655

5756
public SessionVariable getSessionVariable() {
5857
return connectContext.getSessionVariable();
5958
}
6059

61-
public void setBroadcastJoin() {
62-
isBroadcastJoin = true;
63-
}
64-
6560
public boolean isBroadcastJoin() {
6661
return isBroadcastJoin;
6762
}
6863

6964
public int arity() {
70-
return arity;
65+
return groupExpression.arity();
7166
}
7267

7368
public Statistics getStatisticsWithCheck() {
74-
return planStats;
69+
return groupExpression.getOwnerGroup().getStatistics();
7570
}
7671

7772
public boolean isStatsReliable() {
78-
return isStatsReliable;
73+
return groupExpression.getOwnerGroup().isStatsReliable();
7974
}
8075

8176
/**
8277
* Get child statistics.
8378
*/
8479
public Statistics getChildStatistics(int index) {
85-
return childrenStats.get(index);
86-
}
87-
88-
public List<Statistics> getChildrenStatistics() {
89-
return childrenStats;
80+
return groupExpression.childStatistics(index);
9081
}
9182

9283
public StatementContext getStatementContext() {

fe/fe-core/src/main/java/org/apache/doris/nereids/cost/CostCalculator.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
import org.apache.doris.nereids.PlanContext;
2121
import org.apache.doris.nereids.memo.GroupExpression;
22-
import org.apache.doris.nereids.properties.DistributionSpecReplicated;
2322
import org.apache.doris.nereids.properties.PhysicalProperties;
2423
import org.apache.doris.nereids.trees.plans.Plan;
2524
import org.apache.doris.qe.ConnectContext;
@@ -38,12 +37,7 @@ public class CostCalculator {
3837
*/
3938
public static Cost calculateCost(ConnectContext connectContext, GroupExpression groupExpression,
4039
List<PhysicalProperties> childrenProperties) {
41-
PlanContext planContext = new PlanContext(connectContext, groupExpression);
42-
if (childrenProperties.size() >= 2
43-
&& childrenProperties.get(1).getDistributionSpec() instanceof DistributionSpecReplicated) {
44-
planContext.setBroadcastJoin();
45-
}
46-
40+
PlanContext planContext = new PlanContext(connectContext, groupExpression, childrenProperties);
4741
CostModel costModelV1 = new CostModel(connectContext);
4842
return groupExpression.getPlan().accept(costModelV1, planContext);
4943
}

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

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

2020
import org.apache.doris.common.Pair;
2121
import org.apache.doris.nereids.cost.Cost;
22+
import org.apache.doris.nereids.properties.DistributionSpec;
2223
import org.apache.doris.nereids.properties.LogicalProperties;
2324
import org.apache.doris.nereids.properties.PhysicalProperties;
2425
import org.apache.doris.nereids.trees.expressions.literal.Literal;
@@ -27,6 +28,7 @@
2728
import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
2829
import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
2930
import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
31+
import org.apache.doris.nereids.trees.plans.physical.PhysicalDistribute;
3032
import org.apache.doris.nereids.trees.plans.physical.PhysicalPlan;
3133
import org.apache.doris.nereids.util.TreeStringUtils;
3234
import org.apache.doris.nereids.util.Utils;
@@ -60,6 +62,7 @@ public class Group {
6062
private final List<GroupExpression> logicalExpressions = Lists.newArrayList();
6163
private final List<GroupExpression> physicalExpressions = Lists.newArrayList();
6264
private final Map<GroupExpression, GroupExpression> enforcers = Maps.newHashMap();
65+
private final Map<DistributionSpec, GroupExpression> enforcerSpecs = Maps.newHashMap();
6366
private boolean isStatsReliable = true;
6467
private LogicalProperties logicalProperties;
6568

@@ -243,15 +246,28 @@ public GroupExpression getBestPlan(PhysicalProperties properties) {
243246
return null;
244247
}
245248

249+
/**
250+
* add a new enforcer to this group.
251+
*/
246252
public void addEnforcer(GroupExpression enforcer) {
247253
enforcer.setOwnerGroup(this);
254+
if (enforcer.getPlan() instanceof PhysicalDistribute) {
255+
DistributionSpec distributionSpec = ((PhysicalDistribute) enforcer.getPlan()).getDistributionSpec();
256+
if (null != enforcerSpecs.put(distributionSpec, enforcer)) {
257+
return;
258+
}
259+
}
248260
enforcers.put(enforcer, enforcer);
249261
}
250262

251263
public Map<GroupExpression, GroupExpression> getEnforcers() {
252264
return enforcers;
253265
}
254266

267+
public Map<DistributionSpec, GroupExpression> getEnforcerSpecs() {
268+
return enforcerSpecs;
269+
}
270+
255271
/**
256272
* Set or update lowestCostPlans: properties --> Pair.of(cost, expression)
257273
*/
@@ -356,6 +372,7 @@ public void mergeTo(Group target) {
356372
// TODO: dedup?
357373
enforcers.forEach((k, v) -> target.addEnforcer(k));
358374
enforcers.clear();
375+
enforcerSpecs.clear();
359376

360377
// move LogicalExpression PhysicalExpression Ownership
361378
Map<GroupExpression, GroupExpression> logicalSet = target.getLogicalExpressions().stream()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public class GroupExpression {
5454
private static final EventProducer COST_STATE_TRACER = new EventProducer(CostStateUpdateEvent.class,
5555
EventChannel.getDefaultChannel().addConsumers(new LogConsumer(CostStateUpdateEvent.class,
5656
EventChannel.LOG)));
57-
private Cost cost;
57+
private Cost cost = null;
5858
private Group ownerGroup;
5959
private final List<Group> children;
6060
private final Plan plan;

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373

7474
import java.util.ArrayList;
7575
import java.util.Arrays;
76+
import java.util.Collections;
7677
import java.util.HashSet;
7778
import java.util.LinkedHashMap;
7879
import java.util.List;
@@ -98,7 +99,8 @@ public ChildOutputPropertyDeriver(List<PhysicalProperties> childrenOutputPropert
9899
}
99100

100101
public PhysicalProperties getOutputProperties(ConnectContext connectContext, GroupExpression groupExpression) {
101-
return groupExpression.getPlan().accept(this, new PlanContext(connectContext, groupExpression));
102+
return groupExpression.getPlan().accept(this,
103+
new PlanContext(connectContext, groupExpression, Collections.emptyList()));
102104
}
103105

104106
@Override

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,9 @@ private void updateChildEnforceAndCost(GroupExpression child, PhysicalProperties
867867
currentCost = newChildAndCost.first;
868868
}
869869

870+
if (child.getOwnerGroup().getEnforcerSpecs().containsKey(target)) {
871+
return;
872+
}
870873
PhysicalProperties newOutputProperty = new PhysicalProperties(target);
871874
GroupExpression enforcer = target.addEnforcer(child.getOwnerGroup());
872875
child.getOwnerGroup().addEnforcer(enforcer);

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.apache.doris.nereids.trees.expressions.ExprId;
2121

2222
import java.util.List;
23+
import java.util.Objects;
2324

2425
/**
2526
* use for shuffle data by partition keys before sink.
@@ -44,4 +45,21 @@ public void setOutputColExprIds(List<ExprId> outputColExprIds) {
4445
public boolean satisfy(DistributionSpec other) {
4546
return other instanceof DistributionSpecHiveTableSinkHashPartitioned;
4647
}
48+
49+
@Override
50+
public boolean equals(Object o) {
51+
if (o == null || getClass() != o.getClass()) {
52+
return false;
53+
}
54+
if (!super.equals(o)) {
55+
return false;
56+
}
57+
DistributionSpecHiveTableSinkHashPartitioned that = (DistributionSpecHiveTableSinkHashPartitioned) o;
58+
return Objects.equals(outputColExprIds, that.outputColExprIds);
59+
}
60+
61+
@Override
62+
public int hashCode() {
63+
return Objects.hash(super.hashCode(), outputColExprIds);
64+
}
4765
}

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,11 @@ private PhysicalProperties enforceDistribution(PhysicalProperties oldOutputPrope
123123
}
124124

125125
PhysicalProperties newOutputProperty = new PhysicalProperties(outputDistributionSpec);
126-
GroupExpression enforcer = outputDistributionSpec.addEnforcer(groupExpression.getOwnerGroup());
126+
GroupExpression enforcer = groupExpression.getOwnerGroup().getEnforcerSpecs().get(outputDistributionSpec);
127+
128+
if (enforcer == null) {
129+
enforcer = outputDistributionSpec.addEnforcer(groupExpression.getOwnerGroup());
130+
}
127131
addEnforcerUpdateCost(enforcer, oldOutputProperty, newOutputProperty);
128132
return newOutputProperty;
129133
}
@@ -160,10 +164,13 @@ private void addEnforcerUpdateCost(GroupExpression enforcer,
160164
oldOutputProperty, newOutputProperty);
161165
ENFORCER_TRACER.log(EnforcerEvent.of(groupExpression, ((PhysicalPlan) enforcer.getPlan()),
162166
oldOutputProperty, newOutputProperty));
163-
enforcer.setEstOutputRowCount(enforcer.getOwnerGroup().getStatistics().getRowCount());
164-
Cost enforcerCost = CostCalculator.calculateCost(connectContext, enforcer,
165-
Lists.newArrayList(oldOutputProperty));
166-
enforcer.setCost(enforcerCost);
167+
Cost enforcerCost = enforcer.getCost();
168+
if (enforcerCost == null) {
169+
enforcer.setEstOutputRowCount(enforcer.getOwnerGroup().getStatistics().getRowCount());
170+
enforcerCost = CostCalculator.calculateCost(connectContext, enforcer,
171+
Lists.newArrayList(oldOutputProperty));
172+
enforcer.setCost(enforcerCost);
173+
}
167174
curTotalCost = CostCalculator.addChildCost(
168175
connectContext,
169176
enforcer.getPlan(),

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
import com.google.common.collect.Sets;
7474

7575
import java.util.ArrayList;
76+
import java.util.Collections;
7677
import java.util.HashMap;
7778
import java.util.HashSet;
7879
import java.util.List;
@@ -113,7 +114,8 @@ public RequestPropertyDeriver(ConnectContext connectContext, PhysicalProperties
113114
*/
114115
public List<List<PhysicalProperties>> getRequestChildrenPropertyList(GroupExpression groupExpression) {
115116
requestPropertyToChildren = Lists.newArrayList();
116-
groupExpression.getPlan().accept(this, new PlanContext(connectContext, groupExpression));
117+
groupExpression.getPlan().accept(this,
118+
new PlanContext(connectContext, groupExpression, Collections.emptyList()));
117119
return requestPropertyToChildren;
118120
}
119121

fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/OuterJoinLAsscomProject.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import org.apache.doris.nereids.rules.exploration.CBOUtils;
2424
import org.apache.doris.nereids.rules.exploration.OneExplorationRuleFactory;
2525
import org.apache.doris.nereids.trees.expressions.ExprId;
26-
import org.apache.doris.nereids.trees.expressions.SlotReference;
2726
import org.apache.doris.nereids.trees.plans.GroupPlan;
2827
import org.apache.doris.nereids.trees.plans.JoinType;
2928
import org.apache.doris.nereids.trees.plans.Plan;
@@ -36,7 +35,6 @@
3635

3736
import java.util.HashSet;
3837
import java.util.Set;
39-
import java.util.stream.Collectors;
4038
import java.util.stream.Stream;
4139

4240
/**
@@ -116,11 +114,7 @@ public static boolean checkCondition(LogicalJoin<? extends Plan, GroupPlan> topJ
116114
topJoin.getHashJoinConjuncts().stream(),
117115
topJoin.getOtherJoinConjuncts().stream())
118116
.allMatch(expr -> {
119-
Set<ExprId> usedExprIdSet = expr.<SlotReference>collect(SlotReference.class::isInstance)
120-
.stream()
121-
.map(SlotReference::getExprId)
122-
.collect(Collectors.toSet());
123-
return !Utils.isIntersecting(usedExprIdSet, bOutputExprIdSet);
117+
return !Utils.isIntersecting(expr.getInputSlotExprIds(), bOutputExprIdSet);
124118
});
125119
}
126120

0 commit comments

Comments
 (0)