diff --git a/ydb/core/kqp/provider/yql_kikimr_exec.cpp b/ydb/core/kqp/provider/yql_kikimr_exec.cpp index a1c449d48b78..9fc7b8d0c46e 100644 --- a/ydb/core/kqp/provider/yql_kikimr_exec.cpp +++ b/ydb/core/kqp/provider/yql_kikimr_exec.cpp @@ -765,10 +765,11 @@ class TKiSourceCallableExecutionTransformer : public TAsyncCallbackTransformer fakeReads; auto paramsType = NDq::CollectParameters(programLambda, ctx); + NDq::TSpillingSettings spillingSettings{SessionCtx->Config().GetEnabledSpillingNodes()}; lambda = NDq::BuildProgram( programLambda, *paramsType, compiler, SessionCtx->Query().QueryData->GetAllocState()->TypeEnv, *SessionCtx->Query().QueryData->GetAllocState()->HolderFactory.GetFunctionRegistry(), - ctx, fakeReads, {}); + ctx, fakeReads, spillingSettings); NKikimr::NMiniKQL::TProgramBuilder programBuilder(SessionCtx->Query().QueryData->GetAllocState()->TypeEnv, *SessionCtx->Query().QueryData->GetAllocState()->HolderFactory.GetFunctionRegistry()); diff --git a/ydb/core/kqp/provider/yql_kikimr_settings.cpp b/ydb/core/kqp/provider/yql_kikimr_settings.cpp index 79d50d96f229..0f2cd04f0938 100644 --- a/ydb/core/kqp/provider/yql_kikimr_settings.cpp +++ b/ydb/core/kqp/provider/yql_kikimr_settings.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include namespace NYql { @@ -69,6 +71,21 @@ TKikimrConfiguration::TKikimrConfiguration() { REGISTER_SETTING(*this, OptUseFinalizeByKey); REGISTER_SETTING(*this, CostBasedOptimizationLevel); + REGISTER_SETTING(*this, EnableSpillingNodes) + .Parser([](const TString& v) { + ui64 res = 0; + TVector vec; + StringSplitter(v).SplitBySet(",;| ").AddTo(&vec); + for (auto& s: vec) { + if (s.empty()) { + throw yexception() << "Empty value item"; + } + auto value = FromStringWithDefault( + s, NYql::TDqSettings::EEnabledSpillingNodes::None); + res |= ui64(value); + } + return res; + }); REGISTER_SETTING(*this, MaxDPccpDPTableSize); @@ -125,6 +142,10 @@ bool TKikimrSettings::HasOptUseFinalizeByKey() const { return GetOptionalFlagValue(OptUseFinalizeByKey.Get()) != EOptionalFlag::Disabled; } +ui64 TKikimrSettings::GetEnabledSpillingNodes() const { + return EnableSpillingNodes.Get().GetOrElse(0); +} + EOptionalFlag TKikimrSettings::GetOptPredicateExtract() const { return GetOptionalFlagValue(OptEnablePredicateExtract.Get()); diff --git a/ydb/core/kqp/provider/yql_kikimr_settings.h b/ydb/core/kqp/provider/yql_kikimr_settings.h index bb57a760794e..cf4757d9a3e9 100644 --- a/ydb/core/kqp/provider/yql_kikimr_settings.h +++ b/ydb/core/kqp/provider/yql_kikimr_settings.h @@ -51,6 +51,7 @@ struct TKikimrSettings { NCommon::TConfSetting EnableLlvm; NCommon::TConfSetting HashJoinMode; NCommon::TConfSetting OverrideStatistics; + NCommon::TConfSetting EnableSpillingNodes; /* Disable optimizer rules */ NCommon::TConfSetting OptDisableTopSort; @@ -82,6 +83,7 @@ struct TKikimrSettings { bool HasOptEnableOlapPushdown() const; bool HasOptEnableOlapProvideComputeSharding() const; bool HasOptUseFinalizeByKey() const; + ui64 GetEnabledSpillingNodes() const; EOptionalFlag GetOptPredicateExtract() const; EOptionalFlag GetUseLlvm() const; diff --git a/ydb/core/kqp/query_compiler/kqp_query_compiler.cpp b/ydb/core/kqp/query_compiler/kqp_query_compiler.cpp index a3087c2181ed..15f65fa95762 100644 --- a/ydb/core/kqp/query_compiler/kqp_query_compiler.cpp +++ b/ydb/core/kqp/query_compiler/kqp_query_compiler.cpp @@ -777,8 +777,9 @@ class TKqpQueryCompiler : public IKqpQueryCompiler { stageProto.SetIsEffectsStage(hasEffects || hasTxTableSink); auto paramsType = CollectParameters(stage, ctx); + NDq::TSpillingSettings spillingSettings{Config->GetEnabledSpillingNodes()}; auto programBytecode = NDq::BuildProgram(stage.Program(), *paramsType, *KqlCompiler, TypeEnv, FuncRegistry, - ctx, {}, {}); + ctx, {}, spillingSettings); auto& programProto = *stageProto.MutableProgram(); programProto.SetRuntimeVersion(NYql::NDqProto::ERuntimeVersion::RUNTIME_VERSION_YQL_1_0); diff --git a/ydb/library/yql/providers/dq/common/yql_dq_settings.cpp b/ydb/library/yql/providers/dq/common/yql_dq_settings.cpp index 24f16bd28312..996a7cd1ae47 100644 --- a/ydb/library/yql/providers/dq/common/yql_dq_settings.cpp +++ b/ydb/library/yql/providers/dq/common/yql_dq_settings.cpp @@ -110,7 +110,7 @@ TDqConfiguration::TDqConfiguration() { if (s.empty()) { throw yexception() << "Empty value item"; } - auto value = FromString(s); + auto value = FromStringWithDefault(s, EEnabledSpillingNodes::None); res |= ui64(value); } return res; diff --git a/ydb/library/yql/providers/dq/common/yql_dq_settings.h b/ydb/library/yql/providers/dq/common/yql_dq_settings.h index 1b9c63dd6c0e..8fe9163d9037 100644 --- a/ydb/library/yql/providers/dq/common/yql_dq_settings.h +++ b/ydb/library/yql/providers/dq/common/yql_dq_settings.h @@ -29,6 +29,7 @@ struct TDqSettings { }; enum class EEnabledSpillingNodes : ui64 { + None = 0ULL /* None */, GraceJoin = 1ULL /* "GraceJoin" */, All = ~0ULL /* "All" */, };