diff options
| author | lucius <[email protected]> | 2025-05-13 19:07:47 +0300 |
|---|---|---|
| committer | lucius <[email protected]> | 2025-05-13 19:21:18 +0300 |
| commit | 3d1717e3fc92241ae5cfcbb4c0cf3c827cb59457 (patch) | |
| tree | 6c46cb841fd4bf2003b00fa7469f6011393e8401 | |
| parent | 92e06374736aa28637dc0e706455b65c8268a5e6 (diff) | |
YT-24693 cbo+any
commit_hash:b75294e20c400aeb771f7900f647801db30b07f8
| -rw-r--r-- | yt/yql/providers/yt/provider/yql_yt_join_impl.h | 2 | ||||
| -rw-r--r-- | yt/yql/providers/yt/provider/yql_yt_join_reorder.cpp | 35 | ||||
| -rw-r--r-- | yt/yql/tests/sql/suites/join/cbo_4tables_any.cfg | 5 | ||||
| -rw-r--r-- | yt/yql/tests/sql/suites/join/cbo_4tables_any.sql | 17 |
4 files changed, 50 insertions, 9 deletions
diff --git a/yt/yql/providers/yt/provider/yql_yt_join_impl.h b/yt/yql/providers/yt/provider/yql_yt_join_impl.h index 80f79f4d3b5..d8a109b5cf6 100644 --- a/yt/yql/providers/yt/provider/yql_yt_join_impl.h +++ b/yt/yql/providers/yt/provider/yql_yt_join_impl.h @@ -64,7 +64,7 @@ struct TYtJoinNodeOp : TYtJoinNode { struct TOptimizerLinkSettings { bool HasForceSortedMerge = false; - bool HasHints = false; + bool HasCBOUnsupportedHints = false; }; TYtJoinNodeOp::TPtr ImportYtEquiJoin(TYtEquiJoin equiJoin, TExprContext& ctx); diff --git a/yt/yql/providers/yt/provider/yql_yt_join_reorder.cpp b/yt/yql/providers/yt/provider/yql_yt_join_reorder.cpp index ca808b621b3..17aafe03a93 100644 --- a/yt/yql/providers/yt/provider/yql_yt_join_reorder.cpp +++ b/yt/yql/providers/yt/provider/yql_yt_join_reorder.cpp @@ -89,15 +89,15 @@ public: switch (State->Types->CostBasedOptimizer) { case ECostBasedOptimizerType::PG: - if (linkSettings.HasForceSortedMerge || linkSettings.HasHints) { + if (linkSettings.HasForceSortedMerge || linkSettings.HasCBOUnsupportedHints) { YQL_CLOG(ERROR, ProviderYt) << "PG CBO does not support link settings"; return Root; } opt = State->OptimizerFactory_->MakeJoinCostBasedOptimizerPG(*providerCtx, Ctx, {.Logger = log}); break; case ECostBasedOptimizerType::Native: - if (linkSettings.HasHints) { - YQL_CLOG(ERROR, ProviderYt) << "Native CBO does not suppor link hints"; + if (linkSettings.HasCBOUnsupportedHints) { + YQL_CLOG(ERROR, ProviderYt) << "Native CBO does not support link hints"; return Root; } opt = State->OptimizerFactory_->MakeJoinCostBasedOptimizerNative(*providerCtx, Ctx, {.MaxDPhypDPTableSize = 100000}); @@ -159,10 +159,12 @@ public: const TVector<NDq::TJoinColumn>& rightKeys, const EJoinKind joinType, const EJoinAlgoType joinAlgo, + const bool leftAny, + const bool rightAny, TYtJoinNodeOp* originalOp) : TJoinOptimizerNode(left, right, leftKeys, rightKeys, joinType, joinAlgo, - originalOp ? originalOp->LinkSettings.LeftHints.contains("any") : false, - originalOp ? originalOp->LinkSettings.RightHints.contains("any") : false, + leftAny, + rightAny, originalOp != nullptr) , OriginalOp(originalOp) { } @@ -274,11 +276,28 @@ private: bool nonReorderable = op->LinkSettings.ForceSortedMerge; LinkSettings.HasForceSortedMerge = LinkSettings.HasForceSortedMerge || op->LinkSettings.ForceSortedMerge; - LinkSettings.HasHints = LinkSettings.HasHints || !op->LinkSettings.LeftHints.empty() || !op->LinkSettings.RightHints.empty(); + + bool leftAny = op->LinkSettings.LeftHints.contains("any"); + if (op->LinkSettings.LeftHints.size() > 1 || op->LinkSettings.LeftHints.size() == 1 && !leftAny) { + LinkSettings.HasCBOUnsupportedHints = true; + } + + bool rightAny = op->LinkSettings.RightHints.contains("any"); + if (op->LinkSettings.RightHints.size() > 1 || op->LinkSettings.RightHints.size() == 1 && !rightAny) { + LinkSettings.HasCBOUnsupportedHints = true; + } return std::make_shared<TYtJoinOptimizerNode>( - left, right, leftKeys, rightKeys, joinKind, EJoinAlgoType::GraceJoin, nonReorderable ? op : nullptr - ); + left, + right, + leftKeys, + rightKeys, + joinKind, + EJoinAlgoType::GraceJoin, + leftAny, + rightAny, + nonReorderable ? op : nullptr + ); } std::shared_ptr<IBaseOptimizerNode> OnLeaf(TYtJoinNodeLeaf* leaf, TRelSizeInfo sizeInfo) { diff --git a/yt/yql/tests/sql/suites/join/cbo_4tables_any.cfg b/yt/yql/tests/sql/suites/join/cbo_4tables_any.cfg new file mode 100644 index 00000000000..514082c6e4e --- /dev/null +++ b/yt/yql/tests/sql/suites/join/cbo_4tables_any.cfg @@ -0,0 +1,5 @@ +providers yt +in InputA cbo_a.txt +in InputB cbo_b.txt +in InputC cbo_c.txt +in InputD cbo_d.txt diff --git a/yt/yql/tests/sql/suites/join/cbo_4tables_any.sql b/yt/yql/tests/sql/suites/join/cbo_4tables_any.sql new file mode 100644 index 00000000000..40f4fb0add8 --- /dev/null +++ b/yt/yql/tests/sql/suites/join/cbo_4tables_any.sql @@ -0,0 +1,17 @@ +USE plato; +pragma warning("disable", "8001"); -- CBO_MISSING_TABLE_STATS + +pragma CostBasedOptimizer="native"; +pragma yt.MapJoinLimit="1000"; +pragma yt.LookupJoinLimit="1000"; +pragma yt.LookupJoinMaxRows="100"; +pragma yt.ExtendedStatsMaxChunkCount="0"; +pragma yt.JoinMergeTablesLimit="100"; + +SELECT + InputA.Key1, InputA.Key2, InputA.Value, InputB.val, InputC.v, InputD.value as vald +FROM + InputA + INNER JOIN ANY InputD ON InputA.Key2 = InputD.k + INNER JOIN ANY InputB ON InputA.Fk1 = InputB.k + INNER JOIN ANY InputC ON InputA.Key1 = InputC.k |
