diff options
author | Pavel Velikhov <pavelvelikhov@ydb.tech> | 2024-03-13 14:08:32 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-13 12:08:32 +0100 |
commit | 7c77f0898e5fa635a1252426be1453364d4c737a (patch) | |
tree | 4c5279dd0c7fb46e5144b597c23a0ae29e23db97 | |
parent | 7a673cf01feefbe95bf5e7396d9179a5f283aeba (diff) | |
download | ydb-7c77f0898e5fa635a1252426be1453364d4c737a.tar.gz |
Fixed a bug where Lookup Join was always picked by CBO (#2682)
-rw-r--r-- | ydb/core/kqp/host/kqp_runner.cpp | 2 | ||||
-rw-r--r-- | ydb/core/kqp/opt/logical/kqp_opt_log.cpp | 15 | ||||
-rw-r--r-- | ydb/core/kqp/opt/logical/kqp_opt_log.h | 3 |
3 files changed, 9 insertions, 11 deletions
diff --git a/ydb/core/kqp/host/kqp_runner.cpp b/ydb/core/kqp/host/kqp_runner.cpp index 84601a3f25..3464ad1660 100644 --- a/ydb/core/kqp/host/kqp_runner.cpp +++ b/ydb/core/kqp/host/kqp_runner.cpp @@ -271,7 +271,7 @@ private: .AddCommonOptimization() .Add(CreateKqpConstantFoldingTransformer(OptimizeCtx, *typesCtx, Config), "ConstantFolding") .Add(CreateKqpStatisticsTransformer(OptimizeCtx, *typesCtx, Config, Pctx), "Statistics") - .Add(CreateKqpLogOptTransformer(OptimizeCtx, *typesCtx, Config, Pctx), "LogicalOptimize") + .Add(CreateKqpLogOptTransformer(OptimizeCtx, *typesCtx, Config), "LogicalOptimize") .Add(CreateLogicalDataProposalsInspector(*typesCtx), "ProvidersLogicalOptimize") .Add(CreateKqpPhyOptTransformer(OptimizeCtx, *typesCtx, Config), "KqpPhysicalOptimize") .Add(CreatePhysicalDataProposalsInspector(*typesCtx), "ProvidersPhysicalOptimize") diff --git a/ydb/core/kqp/opt/logical/kqp_opt_log.cpp b/ydb/core/kqp/opt/logical/kqp_opt_log.cpp index 8d615ffd7a..4df82a26b1 100644 --- a/ydb/core/kqp/opt/logical/kqp_opt_log.cpp +++ b/ydb/core/kqp/opt/logical/kqp_opt_log.cpp @@ -23,12 +23,11 @@ using namespace NYql::NNodes; class TKqpLogicalOptTransformer : public TOptimizeTransformerBase { public: TKqpLogicalOptTransformer(TTypeAnnotationContext& typesCtx, const TIntrusivePtr<TKqpOptimizeContext>& kqpCtx, - const TKikimrConfiguration::TPtr& config, TKqpProviderContext& pctx) + const TKikimrConfiguration::TPtr& config) : TOptimizeTransformerBase(nullptr, NYql::NLog::EComponent::ProviderKqp, {}) , TypesCtx(typesCtx) , KqpCtx(*kqpCtx) , Config(config) - , Pctx(pctx) { #define HNDL(name) "KqpLogical-"#name, Hndl(&TKqpLogicalOptTransformer::name) AddHandler(0, &TCoFlatMapBase::Match, HNDL(PushPredicateToReadTable)); @@ -168,8 +167,10 @@ protected: TMaybeNode<TExprBase> OptimizeEquiJoinWithCosts(TExprBase node, TExprContext& ctx) { auto maxDPccpDPTableSize = Config->MaxDPccpDPTableSize.Get().GetOrElse(TDqSettings::TDefault::MaxDPccpDPTableSize); - auto opt = std::unique_ptr<IOptimizerNew>(MakeNativeOptimizerNew(Pctx, maxDPccpDPTableSize)); - TExprBase output = DqOptimizeEquiJoinWithCosts(node, ctx, TypesCtx, Config->CostBasedOptimizationLevel.Get().GetOrElse(TDqSettings::TDefault::CostBasedOptimizationLevel), + auto optLevel = Config->CostBasedOptimizationLevel.Get().GetOrElse(TDqSettings::TDefault::CostBasedOptimizationLevel); + auto providerCtx = TKqpProviderContext(KqpCtx, optLevel); + auto opt = std::unique_ptr<IOptimizerNew>(MakeNativeOptimizerNew(providerCtx, maxDPccpDPTableSize)); + TExprBase output = DqOptimizeEquiJoinWithCosts(node, ctx, TypesCtx, optLevel, *opt, [](auto& rels, auto label, auto node, auto stat) { rels.emplace_back(std::make_shared<TKqpRelOptimizerNode>(TString(label), stat, node)); }); @@ -373,14 +374,12 @@ private: TTypeAnnotationContext& TypesCtx; const TKqpOptimizeContext& KqpCtx; const TKikimrConfiguration::TPtr& Config; - TKqpProviderContext& Pctx; }; TAutoPtr<IGraphTransformer> CreateKqpLogOptTransformer(const TIntrusivePtr<TKqpOptimizeContext>& kqpCtx, - TTypeAnnotationContext& typesCtx, const TKikimrConfiguration::TPtr& config, - TKqpProviderContext& pctx) + TTypeAnnotationContext& typesCtx, const TKikimrConfiguration::TPtr& config) { - return THolder<IGraphTransformer>(new TKqpLogicalOptTransformer(typesCtx, kqpCtx, config, pctx)); + return THolder<IGraphTransformer>(new TKqpLogicalOptTransformer(typesCtx, kqpCtx, config)); } } // namespace NKikimr::NKqp::NOpt diff --git a/ydb/core/kqp/opt/logical/kqp_opt_log.h b/ydb/core/kqp/opt/logical/kqp_opt_log.h index 3e5e9ed879..501c5ee0cb 100644 --- a/ydb/core/kqp/opt/logical/kqp_opt_log.h +++ b/ydb/core/kqp/opt/logical/kqp_opt_log.h @@ -8,7 +8,6 @@ namespace NKikimr::NKqp::NOpt { struct TKqpOptimizeContext; TAutoPtr<NYql::IGraphTransformer> CreateKqpLogOptTransformer(const TIntrusivePtr<TKqpOptimizeContext>& kqpCtx, - NYql::TTypeAnnotationContext& typesCtx, const NYql::TKikimrConfiguration::TPtr& config, - NKikimr::NKqp::NOpt::TKqpProviderContext& pctx); + NYql::TTypeAnnotationContext& typesCtx, const NYql::TKikimrConfiguration::TPtr& config); } // namespace NKikimr::NKqp::NOpt |