This is an automated email from the ASF dual-hosted git repository. starocean999 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 584646c054d [improvement](nereids)dphyper GraphSimplifier should consider missed edges when estimating join cost (#21747) 584646c054d is described below commit 584646c054d274ebb885fcbbeef3a3fff50860bb Author: starocean999 <40539150+starocean...@users.noreply.github.com> AuthorDate: Thu Sep 28 09:30:57 2023 +0800 [improvement](nereids)dphyper GraphSimplifier should consider missed edges when estimating join cost (#21747) --- .../nereids/jobs/joinorder/hypergraph/Edge.java | 27 +++++++++++++--- .../jobs/joinorder/hypergraph/GraphSimplifier.java | 36 ++++++++++++++++++++-- .../hypergraph/receiver/PlanReceiver.java | 18 +---------- 3 files changed, 57 insertions(+), 24 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/Edge.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/Edge.java index 4172e545596..601aa001ae2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/Edge.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/Edge.java @@ -31,6 +31,7 @@ import java.util.BitSet; import java.util.HashSet; import java.util.List; import java.util.Set; +import javax.annotation.Nullable; /** * Edge in HyperGraph @@ -214,10 +215,6 @@ public class Edge { return join.getExpressions().get(0); } - public List<? extends Expression> getExpressions() { - return join.getExpressions(); - } - public List<Expression> getHashJoinConjuncts() { return join.getHashJoinConjuncts(); } @@ -237,5 +234,27 @@ public class Edge { return String.format("<%s - %s>", LongBitmap.toString(leftExtendedNodes), LongBitmap.toString( rightExtendedNodes)); } + + /** + * extract join type and conjuncts from edges + */ + public static @Nullable JoinType extractJoinTypeAndConjuncts(List<Edge> edges, + List<Expression> hashConjuncts, List<Expression> otherConjuncts) { + JoinType joinType = null; + for (Edge edge : edges) { + if (edge.getJoinType() != joinType && joinType != null) { + return null; + } + Preconditions.checkArgument(joinType == null || joinType == edge.getJoinType()); + joinType = edge.getJoinType(); + hashConjuncts.addAll(edge.getHashJoinConjuncts()); + otherConjuncts.addAll(edge.getOtherJoinConjuncts()); + } + return joinType; + } + + public static Edge createTempEdge(LogicalJoin join) { + return new Edge(join, -1, null, null, 0L); + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/GraphSimplifier.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/GraphSimplifier.java index 380dd698a45..1beb4a4f061 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/GraphSimplifier.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/GraphSimplifier.java @@ -24,6 +24,8 @@ import org.apache.doris.nereids.cost.CostCalculator; import org.apache.doris.nereids.jobs.joinorder.hypergraph.bitmap.LongBitmap; import org.apache.doris.nereids.jobs.joinorder.hypergraph.receiver.Counter; import org.apache.doris.nereids.stats.JoinEstimation; +import org.apache.doris.nereids.trees.expressions.Expression; +import org.apache.doris.nereids.trees.plans.JoinType; import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; import org.apache.doris.nereids.trees.plans.physical.PhysicalHashJoin; import org.apache.doris.nereids.trees.plans.physical.PhysicalNestedLoopJoin; @@ -32,6 +34,7 @@ import org.apache.doris.statistics.Statistics; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.HashMap; @@ -39,6 +42,7 @@ import java.util.List; import java.util.Optional; import java.util.PriorityQueue; import java.util.Stack; +import java.util.stream.Collectors; import javax.annotation.Nullable; /** @@ -388,12 +392,38 @@ public class GraphSimplifier { return Pair.of(joinStats, edge); } + private Edge processMissedEdges(int edgeIndex1, int edgeIndex2, Edge edge) { + List<Edge> edges = Lists.newArrayList(edge); + edges.addAll(graph.getEdges().stream() + .filter(e -> e.getIndex() != edgeIndex1 && e.getIndex() != edgeIndex2 + && LongBitmap.isSubset(e.getReferenceNodes(), edge.getReferenceNodes()) + && !LongBitmap.isSubset(e.getReferenceNodes(), edge.getLeftExtendedNodes()) + && !LongBitmap.isSubset(e.getReferenceNodes(), edge.getRightExtendedNodes())) + .collect(Collectors.toList())); + if (edges.size() > 1) { + List<Expression> hashConjuncts = new ArrayList<>(); + List<Expression> otherConjuncts = new ArrayList<>(); + JoinType joinType = Edge.extractJoinTypeAndConjuncts(edges, hashConjuncts, otherConjuncts); + LogicalJoin oldJoin = edge.getJoin(); + LogicalJoin newJoin = new LogicalJoin<>(joinType, hashConjuncts, + otherConjuncts, oldJoin.getHint(), oldJoin.left(), oldJoin.right()); + Edge newEdge = Edge.createTempEdge(newJoin); + newEdge.setLeftExtendedNodes(edge.getLeftExtendedNodes()); + newEdge.setRightExtendedNodes(edge.getRightExtendedNodes()); + return newEdge; + } else { + return edge; + } + } + private SimplificationStep orderJoin(Pair<Statistics, Edge> edge1Before2, - Pair<Statistics, Edge> edge2Before1, int edgeIndex1, int edgeIndex2) { - Cost cost1Before2 = calCost(edge1Before2.second, edge1Before2.first, + Pair<Statistics, Edge> edge2Before1, int edgeIndex1, int edgeIndex2) { + Edge edge = processMissedEdges(edgeIndex1, edgeIndex2, edge1Before2.second); + Cost cost1Before2 = calCost(edge, edge1Before2.first, cacheStats.get(edge1Before2.second.getLeftExtendedNodes()), cacheStats.get(edge1Before2.second.getRightExtendedNodes())); - Cost cost2Before1 = calCost(edge2Before1.second, edge1Before2.first, + edge = processMissedEdges(edgeIndex1, edgeIndex2, edge2Before1.second); + Cost cost2Before1 = calCost(edge, edge1Before2.first, cacheStats.get(edge1Before2.second.getLeftExtendedNodes()), cacheStats.get(edge1Before2.second.getRightExtendedNodes())); double benefit = Double.MAX_VALUE; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java index b33c8134c45..099118c65e6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/receiver/PlanReceiver.java @@ -60,7 +60,6 @@ import java.util.Set; import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.annotation.Nullable; /** * The Receiver is used for cached the plan that has been emitted and build the new plan @@ -118,7 +117,7 @@ public class PlanReceiver implements AbstractReceiver { List<Expression> hashConjuncts = new ArrayList<>(); List<Expression> otherConjuncts = new ArrayList<>(); - JoinType joinType = extractJoinTypeAndConjuncts(edges, hashConjuncts, otherConjuncts); + JoinType joinType = Edge.extractJoinTypeAndConjuncts(edges, hashConjuncts, otherConjuncts); if (joinType == null) { return true; } @@ -237,21 +236,6 @@ public class PlanReceiver implements AbstractReceiver { return plans; } - private @Nullable JoinType extractJoinTypeAndConjuncts(List<Edge> edges, List<Expression> hashConjuncts, - List<Expression> otherConjuncts) { - JoinType joinType = null; - for (Edge edge : edges) { - if (edge.getJoinType() != joinType && joinType != null) { - return null; - } - Preconditions.checkArgument(joinType == null || joinType == edge.getJoinType()); - joinType = edge.getJoinType(); - hashConjuncts.addAll(edge.getHashJoinConjuncts()); - otherConjuncts.addAll(edge.getOtherJoinConjuncts()); - } - return joinType; - } - private boolean extractIsMarkJoin(List<Edge> edges) { boolean isMarkJoin = false; JoinType joinType = null; --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org