|
36 | 36 | import com.facebook.presto.matching.Captures; |
37 | 37 | import com.facebook.presto.matching.Pattern; |
38 | 38 | import com.facebook.presto.spi.plan.PlanNode; |
| 39 | +import com.facebook.presto.spi.statistics.HistoryBasedSourceInfo; |
39 | 40 | import com.facebook.presto.sql.analyzer.FeaturesConfig.JoinDistributionType; |
40 | 41 | import com.facebook.presto.sql.planner.iterative.Rule; |
41 | 42 | import com.facebook.presto.sql.planner.plan.SemiJoinNode; |
|
48 | 49 | import static com.facebook.presto.SystemSessionProperties.getJoinDistributionType; |
49 | 50 | import static com.facebook.presto.SystemSessionProperties.getJoinMaxBroadcastTableSize; |
50 | 51 | import static com.facebook.presto.SystemSessionProperties.isSizeBasedJoinDistributionTypeEnabled; |
| 52 | +import static com.facebook.presto.SystemSessionProperties.isUseBroadcastJoinWhenBuildSizeSmallProbeSizeUnknownEnabled; |
51 | 53 | import static com.facebook.presto.cost.CostCalculatorWithEstimatedExchanges.calculateJoinCostWithoutOutput; |
52 | 54 | import static com.facebook.presto.sql.planner.iterative.rule.DetermineJoinDistributionType.getSourceTablesSizeInBytes; |
53 | 55 | import static com.facebook.presto.sql.planner.plan.Patterns.semiJoin; |
54 | 56 | import static com.facebook.presto.sql.planner.plan.SemiJoinNode.DistributionType.PARTITIONED; |
55 | 57 | import static com.facebook.presto.sql.planner.plan.SemiJoinNode.DistributionType.REPLICATED; |
| 58 | +import static com.google.common.collect.ImmutableList.toImmutableList; |
| 59 | +import static com.google.common.collect.Iterables.getOnlyElement; |
56 | 60 | import static java.util.Objects.requireNonNull; |
57 | 61 |
|
58 | 62 | /** |
@@ -124,6 +128,12 @@ private PlanNode getCostBasedDistributionType(SemiJoinNode node, Context context |
124 | 128 | possibleJoinNodes.add(getSemiJoinNodeWithCost(node.withDistributionType(PARTITIONED), context)); |
125 | 129 |
|
126 | 130 | if (possibleJoinNodes.stream().anyMatch(result -> result.getCost().hasUnknownComponents())) { |
| 131 | + if (isUseBroadcastJoinWhenBuildSizeSmallProbeSizeUnknownEnabled(context.getSession()) && possibleJoinNodes.stream().anyMatch(result -> ((SemiJoinNode) result.getPlanNode()).getDistributionType().get().equals(REPLICATED))) { |
| 132 | + SemiJoinNode broadcastJoin = (SemiJoinNode) getOnlyElement(possibleJoinNodes.stream().filter(result -> ((SemiJoinNode) result.getPlanNode()).getDistributionType().get().equals(REPLICATED)).map(x -> x.getPlanNode()).collect(toImmutableList())); |
| 133 | + if (context.getStatsProvider().getStats(broadcastJoin.getBuild()).getSourceInfo() instanceof HistoryBasedSourceInfo) { |
| 134 | + return broadcastJoin; |
| 135 | + } |
| 136 | + } |
127 | 137 | if (isSizeBasedJoinDistributionTypeEnabled(context.getSession())) { |
128 | 138 | return getSizeBaseDistributionType(node, context); |
129 | 139 | } |
@@ -155,7 +165,7 @@ private boolean canReplicate(SemiJoinNode node, Context context) |
155 | 165 | PlanNodeStatsEstimate buildSideStatsEstimate = context.getStatsProvider().getStats(buildSide); |
156 | 166 | double buildSideSizeInBytes = buildSideStatsEstimate.getOutputSizeInBytes(buildSide); |
157 | 167 | return buildSideSizeInBytes <= joinMaxBroadcastTableSize.toBytes() |
158 | | - || (isSizeBasedJoinDistributionTypeEnabled(context.getSession()) |
| 168 | + || (isSizeBasedJoinDistributionTypeEnabled(context.getSession()) |
159 | 169 | && getSourceTablesSizeInBytes(buildSide, context) <= joinMaxBroadcastTableSize.toBytes()); |
160 | 170 | } |
161 | 171 |
|
|
0 commit comments