Skip to content

Commit 4eb9bf7

Browse files
fix(cbo): deprecate using EHashJoinMode::Map for full and exclusion joins (#6287)
1 parent 63b44b2 commit 4eb9bf7

File tree

6 files changed

+15
-9
lines changed

6 files changed

+15
-9
lines changed

ydb/core/kqp/opt/logical/kqp_opt_cbo.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ bool TKqpProviderContext::IsJoinApplicable(const std::shared_ptr<IBaseOptimizerN
150150
const std::set<std::pair<NDq::TJoinColumn, NDq::TJoinColumn>>& joinConditions,
151151
const TVector<TString>& leftJoinKeys,
152152
const TVector<TString>& rightJoinKeys,
153-
EJoinAlgoType joinAlgo) {
153+
EJoinAlgoType joinAlgo,
154+
EJoinKind joinKind) {
154155

155156
switch( joinAlgo ) {
156157
case EJoinAlgoType::LookupJoin:
@@ -160,7 +161,7 @@ bool TKqpProviderContext::IsJoinApplicable(const std::shared_ptr<IBaseOptimizerN
160161
return IsLookupJoinApplicable(left, right, joinConditions, leftJoinKeys, rightJoinKeys, *this);
161162

162163
case EJoinAlgoType::MapJoin:
163-
return right->Stats->ByteSize < 5e8;
164+
return joinKind != EJoinKind::OuterJoin && joinKind != EJoinKind::Exclusion && right->Stats->ByteSize < 5e8;
164165
case EJoinAlgoType::GraceJoin:
165166
return true;
166167
default:

ydb/core/kqp/opt/logical/kqp_opt_cbo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ struct TKqpProviderContext : public NYql::TBaseProviderContext {
2727
const std::shared_ptr<NYql::IBaseOptimizerNode>& right,
2828
const std::set<std::pair<NYql::NDq::TJoinColumn, NYql::NDq::TJoinColumn>>& joinConditions,
2929
const TVector<TString>& leftJoinKeys, const TVector<TString>& rightJoinKeys,
30-
NYql::EJoinAlgoType joinAlgo) override;
30+
NYql::EJoinAlgoType joinAlgo, NYql::EJoinKind joinKind) override;
3131

3232
virtual double ComputeJoinCost(const NYql::TOptimizerStatistics& leftStats, const NYql::TOptimizerStatistics& rightStats, const double outputRows, const double outputByteSize, NYql::EJoinAlgoType joinAlgo) const override;
3333

ydb/library/yql/core/cbo/cbo_optimizer_new.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,15 @@ bool TBaseProviderContext::IsJoinApplicable(const std::shared_ptr<IBaseOptimizer
131131
const std::set<std::pair<NDq::TJoinColumn, NDq::TJoinColumn>>& joinConditions,
132132
const TVector<TString>& leftJoinKeys,
133133
const TVector<TString>& rightJoinKeys,
134-
EJoinAlgoType joinAlgo) {
134+
EJoinAlgoType joinAlgo,
135+
EJoinKind joinKind) {
135136

136137
Y_UNUSED(left);
137138
Y_UNUSED(right);
138139
Y_UNUSED(joinConditions);
139140
Y_UNUSED(leftJoinKeys);
140141
Y_UNUSED(rightJoinKeys);
142+
Y_UNUSED(joinKind);
141143

142144
return joinAlgo == EJoinAlgoType::MapJoin;
143145
}

ydb/library/yql/core/cbo/cbo_optimizer_new.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ struct IProviderContext {
8888
const std::set<std::pair<NDq::TJoinColumn, NDq::TJoinColumn>>& joinConditions,
8989
const TVector<TString>& leftJoinKeys,
9090
const TVector<TString>& rightJoinKeys,
91-
EJoinAlgoType joinAlgo) = 0;
91+
EJoinAlgoType joinAlgo,
92+
EJoinKind joinKind) = 0;
9293
};
9394

9495
/**
@@ -105,7 +106,8 @@ struct TBaseProviderContext : public IProviderContext {
105106
const std::set<std::pair<NDq::TJoinColumn, NDq::TJoinColumn>>& joinConditions,
106107
const TVector<TString>& leftJoinKeys,
107108
const TVector<TString>& rightJoinKeys,
108-
EJoinAlgoType joinAlgo) override;
109+
EJoinAlgoType joinAlgo,
110+
EJoinKind joinKind) override;
109111

110112
virtual TOptimizerStatistics ComputeJoinStats(
111113
const TOptimizerStatistics& leftStats,

ydb/library/yql/dq/opt/dq_opt_dphyp_solver.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ template <typename TNodeSet> std::shared_ptr<TJoinOptimizerNodeInternal> TDPHypS
404404
bool bestJoinIsReversed = false;
405405

406406
for (auto joinAlgo : AllJoinAlgos) {
407-
if (ctx.IsJoinApplicable(left, right, joinConditions, leftJoinKeys, rightJoinKeys, joinAlgo)){
407+
if (ctx.IsJoinApplicable(left, right, joinConditions, leftJoinKeys, rightJoinKeys, joinAlgo, joinKind)){
408408
auto cost = ctx.ComputeJoinStats(*left->Stats, *right->Stats, leftJoinKeys, rightJoinKeys, joinAlgo, joinKind).Cost;
409409
if (cost < bestCost) {
410410
bestCost = cost;
@@ -414,7 +414,7 @@ template <typename TNodeSet> std::shared_ptr<TJoinOptimizerNodeInternal> TDPHypS
414414
}
415415

416416
if (isCommutative) {
417-
if (ctx.IsJoinApplicable(right, left, reversedJoinConditions, rightJoinKeys, leftJoinKeys, joinAlgo)){
417+
if (ctx.IsJoinApplicable(right, left, reversedJoinConditions, rightJoinKeys, leftJoinKeys, joinAlgo, joinKind)){
418418
auto cost = ctx.ComputeJoinStats(*right->Stats, *left->Stats, rightJoinKeys, leftJoinKeys, joinAlgo, joinKind).Cost;
419419
if (cost < bestCost) {
420420
bestCost = cost;

ydb/library/yql/dq/opt/dq_opt_phy.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2666,7 +2666,8 @@ TExprBase DqBuildJoin(const TExprBase& node, TExprContext& ctx, IOptimizationCon
26662666
const bool rightIsUnionAll = join.RightInput().Maybe<TDqCnUnionAll>().IsValid();
26672667

26682668
auto joinAlgo = FromString<EJoinAlgoType>(join.JoinAlgo().StringValue());
2669-
if (joinAlgo == EJoinAlgoType::MapJoin) {
2669+
const bool mapJoinCanBeApplied = joinType != "Full"sv && joinType != "Exclusion"sv;
2670+
if (joinAlgo == EJoinAlgoType::MapJoin && mapJoinCanBeApplied) {
26702671
hashJoin = EHashJoinMode::Map;
26712672
} else if (joinAlgo == EJoinAlgoType::GraceJoin) {
26722673
hashJoin = EHashJoinMode::GraceAndSelf;

0 commit comments

Comments
 (0)