diff options
author | udovichenko-r <rvu@ydb.tech> | 2023-11-07 11:44:43 +0300 |
---|---|---|
committer | udovichenko-r <rvu@ydb.tech> | 2023-11-07 12:31:24 +0300 |
commit | 91f80d2b584ef9ab94101430a1ce7be06ac2ac8b (patch) | |
tree | a9dc057657189a7d811aedb2a78638612f853509 | |
parent | d194c677432655c3aaeed588e60c408a12dd98db (diff) | |
download | ydb-91f80d2b584ef9ab94101430a1ce7be06ac2ac8b.tar.gz |
[dq] Some optimizer fixes
YQL-16013
-rw-r--r-- | ydb/core/kqp/opt/physical/kqp_opt_phy.cpp | 8 | ||||
-rw-r--r-- | ydb/library/yql/dq/opt/dq_opt_phy.cpp | 6 | ||||
-rw-r--r-- | ydb/library/yql/dq/opt/dq_opt_phy.h | 4 | ||||
-rw-r--r-- | ydb/library/yql/dq/opt/dq_opt_phy_finalizing.cpp | 2 | ||||
-rw-r--r-- | ydb/library/yql/providers/dq/opt/physical_optimize.cpp | 8 |
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> |