summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlucius <[email protected]>2025-05-13 19:07:47 +0300
committerlucius <[email protected]>2025-05-13 19:21:18 +0300
commit3d1717e3fc92241ae5cfcbb4c0cf3c827cb59457 (patch)
tree6c46cb841fd4bf2003b00fa7469f6011393e8401
parent92e06374736aa28637dc0e706455b65c8268a5e6 (diff)
YT-24693 cbo+any
commit_hash:b75294e20c400aeb771f7900f647801db30b07f8
-rw-r--r--yt/yql/providers/yt/provider/yql_yt_join_impl.h2
-rw-r--r--yt/yql/providers/yt/provider/yql_yt_join_reorder.cpp35
-rw-r--r--yt/yql/tests/sql/suites/join/cbo_4tables_any.cfg5
-rw-r--r--yt/yql/tests/sql/suites/join/cbo_4tables_any.sql17
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