[opt](nereids) refine left semi/anti cost under short-cut opt (#39636)
## Proposed changes pick from https://github.com/apache/doris/pull/37951 --------- Co-authored-by: xiongzhongjian <xiongzhongjian@selectdb.com>
This commit is contained in:
@ -396,6 +396,15 @@ class CostModelV1 extends PlanVisitor<Cost, PlanContext> {
|
||||
);
|
||||
}
|
||||
|
||||
double probeShortcutFactor = 1.0;
|
||||
if (ConnectContext.get() != null && ConnectContext.get().getStatementContext() != null
|
||||
&& !ConnectContext.get().getStatementContext().isHasUnknownColStats()
|
||||
&& physicalHashJoin.getJoinType().isLeftSemiOrAntiJoin()
|
||||
&& physicalHashJoin.getOtherJoinConjuncts().isEmpty()
|
||||
&& physicalHashJoin.getMarkJoinConjuncts().isEmpty()) {
|
||||
// left semi/anti has short-cut opt, add probe side factor for distinguishing from the right ones
|
||||
probeShortcutFactor = context.getSessionVariable().getLeftSemiOrAntiProbeFactor();
|
||||
}
|
||||
if (context.isBroadcastJoin()) {
|
||||
// compared with shuffle join, bc join will be taken a penalty for both build and probe side;
|
||||
// currently we use the following factor as the penalty factor:
|
||||
@ -417,14 +426,15 @@ class CostModelV1 extends PlanVisitor<Cost, PlanContext> {
|
||||
}
|
||||
}
|
||||
return CostV1.of(context.getSessionVariable(),
|
||||
leftRowCount + rightRowCount * buildSideFactor + outputRowCount * probeSideFactor,
|
||||
leftRowCount * probeShortcutFactor + rightRowCount * probeShortcutFactor * buildSideFactor
|
||||
+ outputRowCount * probeSideFactor,
|
||||
rightRowCount,
|
||||
0
|
||||
);
|
||||
}
|
||||
return CostV1.of(context.getSessionVariable(), leftRowCount + rightRowCount + outputRowCount,
|
||||
rightRowCount,
|
||||
0
|
||||
return CostV1.of(context.getSessionVariable(),
|
||||
leftRowCount * probeShortcutFactor + rightRowCount * probeShortcutFactor + outputRowCount,
|
||||
rightRowCount, 0
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -300,6 +300,7 @@ public class SessionVariable implements Serializable, Writable {
|
||||
|
||||
public static final String FORBID_UNKNOWN_COLUMN_STATS = "forbid_unknown_col_stats";
|
||||
public static final String BROADCAST_RIGHT_TABLE_SCALE_FACTOR = "broadcast_right_table_scale_factor";
|
||||
public static final String LEFT_SEMI_OR_ANTI_PROBE_FACTOR = "left_semi_or_anti_probe_factor";
|
||||
public static final String BROADCAST_ROW_COUNT_LIMIT = "broadcast_row_count_limit";
|
||||
|
||||
// percentage of EXEC_MEM_LIMIT
|
||||
@ -1253,6 +1254,9 @@ public class SessionVariable implements Serializable, Writable {
|
||||
@VariableMgr.VarAttr(name = BROADCAST_RIGHT_TABLE_SCALE_FACTOR)
|
||||
private double broadcastRightTableScaleFactor = 0.0;
|
||||
|
||||
@VariableMgr.VarAttr(name = LEFT_SEMI_OR_ANTI_PROBE_FACTOR)
|
||||
private double leftSemiOrAntiProbeFactor = 0.05;
|
||||
|
||||
@VariableMgr.VarAttr(name = BROADCAST_ROW_COUNT_LIMIT, needForward = true)
|
||||
private double broadcastRowCountLimit = 30000000;
|
||||
|
||||
@ -2705,6 +2709,14 @@ public class SessionVariable implements Serializable, Writable {
|
||||
this.broadcastRightTableScaleFactor = broadcastRightTableScaleFactor;
|
||||
}
|
||||
|
||||
public double getLeftSemiOrAntiProbeFactor() {
|
||||
return leftSemiOrAntiProbeFactor;
|
||||
}
|
||||
|
||||
public void setLeftSemiOrAntiProbeFactor(double leftSemiOrAntiProbeFactor) {
|
||||
this.leftSemiOrAntiProbeFactor = leftSemiOrAntiProbeFactor;
|
||||
}
|
||||
|
||||
public double getBroadcastRowCountLimit() {
|
||||
return broadcastRowCountLimit;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user