diff options
author | Iuliia Sidorina <yulia@ydb.tech> | 2024-02-15 13:11:08 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-15 13:11:08 +0100 |
commit | 06c0c2c75bad3c7dbeeb0b9aecd652f4fa5bd0ee (patch) | |
tree | 61b37c392906caa01c4b01b070838c495c7da2f1 | |
parent | c79a50623450477e6f22124699835707e3400cfa (diff) | |
download | ydb-06c0c2c75bad3c7dbeeb0b9aecd652f4fa5bd0ee.tar.gz |
YQL-17263: add setting for cbo single pass (#1811)
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; |