aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIuliia Sidorina <yulia@ydb.tech>2024-02-15 13:11:08 +0100
committerGitHub <noreply@github.com>2024-02-15 13:11:08 +0100
commit06c0c2c75bad3c7dbeeb0b9aecd652f4fa5bd0ee (patch)
tree61b37c392906caa01c4b01b070838c495c7da2f1
parentc79a50623450477e6f22124699835707e3400cfa (diff)
downloadydb-06c0c2c75bad3c7dbeeb0b9aecd652f4fa5bd0ee.tar.gz
YQL-17263: add setting for cbo single pass (#1811)
-rw-r--r--ydb/library/yql/core/yql_join.cpp2
-rw-r--r--ydb/library/yql/providers/yt/provider/ut/yql_yt_cbo_ut.cpp32
-rw-r--r--ydb/library/yql/providers/yt/provider/yql_yt_join_impl.cpp5
-rw-r--r--ydb/library/yql/providers/yt/provider/yql_yt_join_impl.h1
-rw-r--r--ydb/library/yql/providers/yt/provider/yql_yt_join_reorder.cpp3
-rw-r--r--ydb/library/yql/providers/yt/provider/yql_yt_physical_optimize.cpp3
6 files changed, 44 insertions, 2 deletions
diff --git a/ydb/library/yql/core/yql_join.cpp b/ydb/library/yql/core/yql_join.cpp
index 7e1a77bebea..3e9841bcedc 100644
--- a/ydb/library/yql/core/yql_join.cpp
+++ b/ydb/library/yql/core/yql_join.cpp
@@ -767,6 +767,8 @@ IGraphTransformer::TStatus ValidateEquiJoinOptions(TPositionHandle positionHandl
ctx.AddError(TIssue(ctx.GetPosition(child->Child(1)->Pos()), TStringBuilder() <<
"Duplicated preferred_sort set: " << JoinSeq(", ", sortBy)));
}
+ } else if (optionName == "cbo_passed") {
+ // do nothing
} else {
ctx.AddError(TIssue(position, TStringBuilder() <<
"Unknown option name: " << optionName));
diff --git a/ydb/library/yql/providers/yt/provider/ut/yql_yt_cbo_ut.cpp b/ydb/library/yql/providers/yt/provider/ut/yql_yt_cbo_ut.cpp
index 44e389bee67..c2eafab44b8 100644
--- a/ydb/library/yql/providers/yt/provider/ut/yql_yt_cbo_ut.cpp
+++ b/ydb/library/yql/providers/yt/provider/ut/yql_yt_cbo_ut.cpp
@@ -265,6 +265,38 @@ Y_UNIT_TEST(UnsupportedJoin)
UNIT_ASSERT(optimizedTree == tree);
}
+Y_UNIT_TEST(OrderJoinSinglePass) {
+ TExprContext exprCtx;
+ auto tree = MakeOp({"c", "c_nationkey"}, {"n", "n_nationkey"}, {"c", "n"}, exprCtx);
+ tree->Left = MakeLeaf({"c"}, {"c"}, 1000000, 1233333, exprCtx);
+ tree->Right = MakeLeaf({"n"}, {"n"}, 10000, 12333, exprCtx);
+ tree->JoinKind = exprCtx.NewAtom(exprCtx.AppendPosition({}), "Left");
+
+ TTypeAnnotationContext typeCtx;
+ TYtState::TPtr state = MakeIntrusive<TYtState>();
+ typeCtx.CostBasedOptimizer = ECostBasedOptimizerType::PG;
+ state->Types = &typeCtx;
+ auto optimizedTree = OrderJoins(tree, state, exprCtx, true);
+ UNIT_ASSERT(optimizedTree != tree);
+ UNIT_ASSERT(optimizedTree->CostBasedOptPassed);
+}
+
+Y_UNIT_TEST(OrderJoinsDoesNothingWhenCBOAlreadyPassed) {
+ TExprContext exprCtx;
+ auto tree = MakeOp({"c", "c_nationkey"}, {"n", "n_nationkey"}, {"c", "n"}, exprCtx);
+ tree->Left = MakeLeaf({"c"}, {"c"}, 1000000, 1233333, exprCtx);
+ tree->Right = MakeLeaf({"n"}, {"n"}, 10000, 12333, exprCtx);
+ tree->JoinKind = exprCtx.NewAtom(exprCtx.AppendPosition({}), "Left");
+ tree->CostBasedOptPassed = true;
+
+ TTypeAnnotationContext typeCtx;
+ TYtState::TPtr state = MakeIntrusive<TYtState>();
+ typeCtx.CostBasedOptimizer = ECostBasedOptimizerType::PG;
+ state->Types = &typeCtx;
+ auto optimizedTree = OrderJoins(tree, state, exprCtx, true);
+ UNIT_ASSERT(optimizedTree == tree);
+}
+
} // Y_UNIT_TEST_SUITE(TYqlCBO)
} // namespace NYql
diff --git a/ydb/library/yql/providers/yt/provider/yql_yt_join_impl.cpp b/ydb/library/yql/providers/yt/provider/yql_yt_join_impl.cpp
index a1d6c505537..c15f6dba273 100644
--- a/ydb/library/yql/providers/yt/provider/yql_yt_join_impl.cpp
+++ b/ydb/library/yql/providers/yt/provider/yql_yt_join_impl.cpp
@@ -4666,6 +4666,7 @@ TYtJoinNodeOp::TPtr ImportYtEquiJoin(TYtEquiJoin equiJoin, TExprContext& ctx) {
root->Constraints = set;
}
+ root->CostBasedOptPassed = HasSetting(equiJoin.JoinOptions().Ref(), "cbo_passed");
return root;
}
@@ -4745,6 +4746,10 @@ TMaybeNode<TExprBase> ExportYtEquiJoin(TYtEquiJoin equiJoin, const TYtJoinNodeOp
joinSettings = ctx.ChangeChildren(*joinSettings, std::move(joinSettingsNodes));
}
+ if (!HasSetting(*joinSettings, "cbo_passed") && op.CostBasedOptPassed) {
+ joinSettings = AddSetting(*joinSettings, joinSettings->Pos(), "cbo_passed", {}, ctx);
+ }
+
auto outItemType = GetSequenceItemType(equiJoin.Pos(),
equiJoin.Ref().GetTypeAnn()->Cast<TTupleExprType>()->GetItems()[1],
false, ctx);
diff --git a/ydb/library/yql/providers/yt/provider/yql_yt_join_impl.h b/ydb/library/yql/providers/yt/provider/yql_yt_join_impl.h
index 39e4a629c56..366209de187 100644
--- a/ydb/library/yql/providers/yt/provider/yql_yt_join_impl.h
+++ b/ydb/library/yql/providers/yt/provider/yql_yt_join_impl.h
@@ -58,6 +58,7 @@ struct TYtJoinNodeOp : TYtJoinNode {
TVector<TYtStarJoinOption> StarOptions;
TMaybeNode<TYtOutputOpBase> Output;
THashSet<TString> OutputRemoveColumns;
+ bool CostBasedOptPassed = false;
};
TYtJoinNodeOp::TPtr ImportYtEquiJoin(TYtEquiJoin equiJoin, TExprContext& ctx);
diff --git a/ydb/library/yql/providers/yt/provider/yql_yt_join_reorder.cpp b/ydb/library/yql/providers/yt/provider/yql_yt_join_reorder.cpp
index e3cff6f3d4b..d4cddf1f0ec 100644
--- a/ydb/library/yql/providers/yt/provider/yql_yt_join_reorder.cpp
+++ b/ydb/library/yql/providers/yt/provider/yql_yt_join_reorder.cpp
@@ -107,6 +107,7 @@ public:
TVector<TString> scope;
TYtJoinNodeOp::TPtr res = dynamic_cast<TYtJoinNodeOp*>(BuildYtJoinTree(result, Ctx, {}).Get());
+ res->CostBasedOptPassed = true;
YQL_ENSURE(res);
if (Debug) {
@@ -298,7 +299,7 @@ TYtJoinNode::TPtr BuildYtJoinTree(std::shared_ptr<IBaseOptimizerNode> node, TExp
TYtJoinNodeOp::TPtr OrderJoins(TYtJoinNodeOp::TPtr op, const TYtState::TPtr& state, TExprContext& ctx, bool debug)
{
- if (state->Types->CostBasedOptimizer == ECostBasedOptimizerType::Disable) {
+ if (state->Types->CostBasedOptimizer == ECostBasedOptimizerType::Disable || op->CostBasedOptPassed) {
return op;
}
diff --git a/ydb/library/yql/providers/yt/provider/yql_yt_physical_optimize.cpp b/ydb/library/yql/providers/yt/provider/yql_yt_physical_optimize.cpp
index da69b0818cf..adf1f696e6d 100644
--- a/ydb/library/yql/providers/yt/provider/yql_yt_physical_optimize.cpp
+++ b/ydb/library/yql/providers/yt/provider/yql_yt_physical_optimize.cpp
@@ -5843,7 +5843,8 @@ private:
const bool tryReorder = State_->Types->CostBasedOptimizer != ECostBasedOptimizerType::Disable
&& equiJoin.Input().Size() > 2
- && HasOnlyOneJoinType(*equiJoin.Joins().Ptr(), "Inner");
+ && HasOnlyOneJoinType(*equiJoin.Joins().Ptr(), "Inner")
+ && !HasSetting(equiJoin.JoinOptions().Ref(), "cbo_passed");
const bool waitAllInputs = State_->Configuration->JoinWaitAllInputs.Get().GetOrElse(false) || tryReorder;