aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorudovichenko-r <rvu@ydb.tech>2023-11-07 11:44:43 +0300
committerudovichenko-r <rvu@ydb.tech>2023-11-07 12:31:24 +0300
commit91f80d2b584ef9ab94101430a1ce7be06ac2ac8b (patch)
treea9dc057657189a7d811aedb2a78638612f853509
parentd194c677432655c3aaeed588e60c408a12dd98db (diff)
downloadydb-91f80d2b584ef9ab94101430a1ce7be06ac2ac8b.tar.gz
[dq] Some optimizer fixes
YQL-16013
-rw-r--r--ydb/core/kqp/opt/physical/kqp_opt_phy.cpp8
-rw-r--r--ydb/library/yql/dq/opt/dq_opt_phy.cpp6
-rw-r--r--ydb/library/yql/dq/opt/dq_opt_phy.h4
-rw-r--r--ydb/library/yql/dq/opt/dq_opt_phy_finalizing.cpp2
-rw-r--r--ydb/library/yql/providers/dq/opt/physical_optimize.cpp8
5 files changed, 18 insertions, 10 deletions
diff --git a/ydb/core/kqp/opt/physical/kqp_opt_phy.cpp b/ydb/core/kqp/opt/physical/kqp_opt_phy.cpp
index 77b029b002..11e5887624 100644
--- a/ydb/core/kqp/opt/physical/kqp_opt_phy.cpp
+++ b/ydb/core/kqp/opt/physical/kqp_opt_phy.cpp
@@ -75,7 +75,7 @@ public:
AddHandler(0, &TCoUnorderedBase::Match, HNDL(DropUnordered));
AddHandler(0, &TDqStage::Match, HNDL(PrecomputeToInput));
AddHandler(0, &TDqStage::Match, HNDL(FloatUpStage));
- AddHandler(0, &TCoHasItems::Match, HNDL(BuildHasItems));
+ AddHandler(0, &TCoHasItems::Match, HNDL(BuildHasItems<false>));
AddHandler(0, &TCoSqlIn::Match, HNDL(BuildSqlIn<false>));
AddHandler(0, &TCoHead::Match, HNDL(BuildScalarPrecompute<false>));
AddHandler(0, &TCoToOptional::Match, HNDL(BuildScalarPrecompute<false>));
@@ -110,6 +110,7 @@ public:
AddHandler(1, &TDqJoin::Match, HNDL(BuildJoin<true>));
AddHandler(1, &TCoLMap::Match, HNDL(PushLMapToStage<true>));
AddHandler(1, &TCoOrderedLMap::Match, HNDL(PushOrderedLMapToStage<true>));
+ AddHandler(1, &TCoHasItems::Match, HNDL(BuildHasItems<true>));
AddHandler(1, &TCoSqlIn::Match, HNDL(BuildSqlIn<true>));
AddHandler(1, &TCoHead::Match, HNDL(BuildScalarPrecompute<true>));
AddHandler(1, &TCoToOptional::Match, HNDL(BuildScalarPrecompute<true>));
@@ -478,8 +479,9 @@ protected:
return output;
}
- TMaybeNode<TExprBase> BuildHasItems(TExprBase node, TExprContext& ctx, IOptimizationContext& optCtx) {
- TExprBase output = DqBuildHasItems(node, ctx, optCtx);
+ template <bool IsGlobal>
+ TMaybeNode<TExprBase> BuildHasItems(TExprBase node, TExprContext& ctx, IOptimizationContext& optCtx, const TGetParents& getParents) {
+ TExprBase output = DqBuildHasItems(node, ctx, optCtx, *getParents(), IsGlobal);
DumpAppliedRule("DqBuildHasItems", node.Ptr(), output.Ptr(), ctx);
return output;
}
diff --git a/ydb/library/yql/dq/opt/dq_opt_phy.cpp b/ydb/library/yql/dq/opt/dq_opt_phy.cpp
index a076a7d170..8afb853e69 100644
--- a/ydb/library/yql/dq/opt/dq_opt_phy.cpp
+++ b/ydb/library/yql/dq/opt/dq_opt_phy.cpp
@@ -2229,7 +2229,7 @@ TExprBase DqBuildPrecompute(TExprBase node, TExprContext& ctx) {
return phyPrecompute;
}
-TExprBase DqBuildHasItems(TExprBase node, TExprContext& ctx, IOptimizationContext& optCtx) {
+TExprBase DqBuildHasItems(TExprBase node, TExprContext& ctx, IOptimizationContext& optCtx, const TParentsMap& parentsMap, bool allowStageMultiUsage) {
if (!node.Maybe<TCoHasItems>()) {
return node;
}
@@ -2242,6 +2242,10 @@ TExprBase DqBuildHasItems(TExprBase node, TExprContext& ctx, IOptimizationContex
auto unionAll = hasItems.List().Cast<TDqCnUnionAll>();
+ if (!IsSingleConsumerConnection(unionAll, parentsMap, allowStageMultiUsage)) {
+ return node;
+ }
+
if (auto connToPushableStage = DqBuildPushableStage(unionAll, ctx)) {
return TExprBase(ctx.ChangeChild(*node.Raw(), TCoHasItems::idx_List, std::move(connToPushableStage)));
}
diff --git a/ydb/library/yql/dq/opt/dq_opt_phy.h b/ydb/library/yql/dq/opt/dq_opt_phy.h
index da514ea422..20d2041e2e 100644
--- a/ydb/library/yql/dq/opt/dq_opt_phy.h
+++ b/ydb/library/yql/dq/opt/dq_opt_phy.h
@@ -105,8 +105,8 @@ NNodes::TExprBase DqBuildExtendStage(NNodes::TExprBase node, TExprContext& ctx);
NNodes::TExprBase DqBuildPrecompute(NNodes::TExprBase node, TExprContext& ctx);
-NYql::NNodes::TExprBase DqBuildHasItems(NYql::NNodes::TExprBase node, NYql::TExprContext& ctx,
- NYql::IOptimizationContext& optCtx);
+NNodes::TExprBase DqBuildHasItems(NYql::NNodes::TExprBase node, NYql::TExprContext& ctx, IOptimizationContext& optCtx,
+ const TParentsMap& parentsMap, bool allowStageMultiUsage = true);
NNodes::TExprBase DqBuildSqlIn(NNodes::TExprBase node, TExprContext& ctx, IOptimizationContext& optCtx,
const TParentsMap& parentsMap, bool allowStageMultiUsage);
diff --git a/ydb/library/yql/dq/opt/dq_opt_phy_finalizing.cpp b/ydb/library/yql/dq/opt/dq_opt_phy_finalizing.cpp
index 93de465775..b93bbcbeaa 100644
--- a/ydb/library/yql/dq/opt/dq_opt_phy_finalizing.cpp
+++ b/ydb/library/yql/dq/opt/dq_opt_phy_finalizing.cpp
@@ -443,7 +443,7 @@ bool GatherConsumersImpl(const TExprNode& node, TNodeMap<TNodeMultiSet>& consume
for (const auto& child : node.Children()) {
if (auto connection = TMaybeNode<TDqConnection>(child)) {
consumers[connection.Cast().Raw()].insert(&node);
- consumers[connection.Cast().Output().Raw()].insert(&node);
+ consumers[connection.Cast().Output().Raw()].insert(connection.Raw());
}
if (!GatherConsumersImpl(*child, consumers, visited)) {
diff --git a/ydb/library/yql/providers/dq/opt/physical_optimize.cpp b/ydb/library/yql/providers/dq/opt/physical_optimize.cpp
index d3cbaddc15..a935041d29 100644
--- a/ydb/library/yql/providers/dq/opt/physical_optimize.cpp
+++ b/ydb/library/yql/providers/dq/opt/physical_optimize.cpp
@@ -52,7 +52,7 @@ public:
AddHandler(0, &TCoOrderedLMap::Match, HNDL(BuildOrderedLMapOverMuxStage));
AddHandler(0, &TCoLMap::Match, HNDL(BuildLMapOverMuxStage));
if (enablePrecompute) {
- AddHandler(0, &TCoHasItems::Match, HNDL(BuildHasItems));
+ AddHandler(0, &TCoHasItems::Match, HNDL(BuildHasItems<false>));
AddHandler(0, &TCoSqlIn::Match, HNDL(BuildSqlIn<false>));
AddHandler(0, &TCoToOptional::Match, HNDL(BuildScalarPrecompute<false>));
AddHandler(0, &TCoHead::Match, HNDL(BuildScalarPrecompute<false>));
@@ -80,6 +80,7 @@ public:
AddHandler(1, &TCoOrderedLMap::Match, HNDL(PushOrderedLMapToStage<true>));
AddHandler(1, &TCoLMap::Match, HNDL(PushLMapToStage<true>));
if (enablePrecompute) {
+ AddHandler(1, &TCoHasItems::Match, HNDL(BuildHasItems<true>));
AddHandler(1, &TCoSqlIn::Match, HNDL(BuildSqlIn<true>));
AddHandler(1, &TCoToOptional::Match, HNDL(BuildScalarPrecompute<true>));
AddHandler(1, &TCoHead::Match, HNDL(BuildScalarPrecompute<true>));
@@ -254,8 +255,9 @@ protected:
return DqBuildJoin(join, ctx, optCtx, *parentsMap, IsGlobal, /* pushLeftStage = */ false /* TODO */, mode);
}
- TMaybeNode<TExprBase> BuildHasItems(TExprBase node, TExprContext& ctx, IOptimizationContext& optCtx) {
- return DqBuildHasItems(node, ctx, optCtx);
+ template <bool IsGlobal>
+ TMaybeNode<TExprBase> BuildHasItems(TExprBase node, TExprContext& ctx, IOptimizationContext& optCtx, const TGetParents& getParents) {
+ return DqBuildHasItems(node, ctx, optCtx, *getParents(), IsGlobal);
}
template <bool IsGlobal>