diff options
author | vvvv <vvvv@yandex-team.com> | 2025-01-10 13:51:46 +0300 |
---|---|---|
committer | vvvv <vvvv@yandex-team.com> | 2025-01-10 14:39:55 +0300 |
commit | a4609b4071a963b34a56c7d8d032a24963b56477 (patch) | |
tree | c4e30593e82bea22737b6d9ac9b377fd181bbade | |
parent | b830866dd04884b8eec69bab3c745c7c25ecb3f4 (diff) | |
download | ydb-a4609b4071a963b34a56c7d8d032a24963b56477.tar.gz |
Skip full pipeline for EvaluateAtom if possible
Для такого запроса (676ea05ee44846078bf3ff0c) сократилось число построение computation graph-ов с 100 до 36
время работы minirun в debug 13 с -\> 10 с
commit_hash:d7627d82b3a9fd49daa36699f21826d9c8796bf6
-rw-r--r-- | yql/essentials/core/services/yql_eval_expr.cpp | 132 |
1 files changed, 69 insertions, 63 deletions
diff --git a/yql/essentials/core/services/yql_eval_expr.cpp b/yql/essentials/core/services/yql_eval_expr.cpp index 6072abd460..bc39a9e9c8 100644 --- a/yql/essentials/core/services/yql_eval_expr.cpp +++ b/yql/essentials/core/services/yql_eval_expr.cpp @@ -973,7 +973,7 @@ IGraphTransformer::TStatus EvaluateExpression(const TExprNode::TPtr& input, TExp clonedArg = ctx.NewCallable(clonedArg->Pos(), "SerializeCode", { clonedArg }); } - TString key; + TString key, yson; NYT::TNode ysonNode; if (types.QContext) { key = MakeCacheKey(*clonedArg); @@ -988,74 +988,80 @@ IGraphTransformer::TStatus EvaluateExpression(const TExprNode::TPtr& input, TExp } do { - calcProvider.Clear(); - calcWorldRoot.Drop(); - fullTransformer->Rewind(); - auto prevSteps = ctx.Step; - TEvalScope scope(types); - ctx.Step.Reset(); - if (prevSteps.IsDone(TExprStep::Recapture)) { - ctx.Step.Done(TExprStep::Recapture); - } - status = SyncTransform(*fullTransformer, clonedArg, ctx); - ctx.Step = prevSteps; - if (status.Level == IGraphTransformer::TStatus::Error) { - return nullptr; - } + if (ysonNode.IsUndefined() && isAtomPipeline && clonedArg->IsCallable("String")) { + ysonNode = NYT::TNode()("Data",NYT::TNode(clonedArg->Head().Content())); + yson = NYT::NodeToYsonString(ysonNode, NYT::NYson::EYsonFormat::Binary); + } else { + calcProvider.Clear(); + calcWorldRoot.Drop(); + fullTransformer->Rewind(); + auto prevSteps = ctx.Step; + TEvalScope scope(types); + ctx.Step.Reset(); + if (prevSteps.IsDone(TExprStep::Recapture)) { + ctx.Step.Done(TExprStep::Recapture); + } + status = SyncTransform(*fullTransformer, clonedArg, ctx); + ctx.Step = prevSteps; + if (status.Level == IGraphTransformer::TStatus::Error) { + return nullptr; + } - // execute calcWorldRoot - auto execTransformer = CreateExecutionTransformer(types, [](const TOperationProgress&){}, false); - status = SyncTransform(*execTransformer, calcWorldRoot, ctx); - if (status.Level == IGraphTransformer::TStatus::Error) { - return nullptr; - } + // execute calcWorldRoot + auto execTransformer = CreateExecutionTransformer(types, [](const TOperationProgress&){}, false); + status = SyncTransform(*execTransformer, calcWorldRoot, ctx); + if (status.Level == IGraphTransformer::TStatus::Error) { + return nullptr; + } - if (types.QContext.CanRead()) { - break; - } + if (types.QContext.CanRead()) { + break; + } - IDataProvider::TFillSettings fillSettings; - auto delegatedNode = Build<TResult>(ctx, node->Pos()) - .Input(clonedArg) - .BytesLimit() - .Value(TString()) - .Build() - .RowsLimit() - .Value(TString()) - .Build() - .FormatDetails() - .Value(ToString((ui32)NYson::EYsonFormat::Binary)) - .Build() - .Settings().Build() - .Format() - .Value(ToString((ui32)IDataProvider::EResultFormat::Yson)) - .Build() - .PublicId() - .Value(TString()) - .Build() - .Discard() - .Value("false") - .Build() - .Origin(calcWorldRoot) - .Done().Ptr(); - - auto atomType = ctx.MakeType<TUnitExprType>(); - for (auto idx: {TResOrPullBase::idx_BytesLimit, TResOrPullBase::idx_RowsLimit, TResOrPullBase::idx_FormatDetails, - TResOrPullBase::idx_Format, TResOrPullBase::idx_PublicId, TResOrPullBase::idx_Discard, TResOrPullBase::idx_Settings }) { - delegatedNode->Child(idx)->SetTypeAnn(atomType); - delegatedNode->Child(idx)->SetState(TExprNode::EState::ConstrComplete); - } + IDataProvider::TFillSettings fillSettings; + auto delegatedNode = Build<TResult>(ctx, node->Pos()) + .Input(clonedArg) + .BytesLimit() + .Value(TString()) + .Build() + .RowsLimit() + .Value(TString()) + .Build() + .FormatDetails() + .Value(ToString((ui32)NYson::EYsonFormat::Binary)) + .Build() + .Settings().Build() + .Format() + .Value(ToString((ui32)IDataProvider::EResultFormat::Yson)) + .Build() + .PublicId() + .Value(TString()) + .Build() + .Discard() + .Value("false") + .Build() + .Origin(calcWorldRoot) + .Done().Ptr(); + + auto atomType = ctx.MakeType<TUnitExprType>(); + for (auto idx: {TResOrPullBase::idx_BytesLimit, TResOrPullBase::idx_RowsLimit, TResOrPullBase::idx_FormatDetails, + TResOrPullBase::idx_Format, TResOrPullBase::idx_PublicId, TResOrPullBase::idx_Discard, TResOrPullBase::idx_Settings }) { + delegatedNode->Child(idx)->SetTypeAnn(atomType); + delegatedNode->Child(idx)->SetState(TExprNode::EState::ConstrComplete); + } - delegatedNode->SetTypeAnn(atomType); - delegatedNode->SetState(TExprNode::EState::ConstrComplete); - auto& transformer = calcTransfomer ? *calcTransfomer : (*calcProvider.Get())->GetCallableExecutionTransformer(); - status = SyncTransform(transformer, delegatedNode, ctx); - if (status.Level == IGraphTransformer::TStatus::Error) { - return nullptr; + delegatedNode->SetTypeAnn(atomType); + delegatedNode->SetState(TExprNode::EState::ConstrComplete); + auto& transformer = calcTransfomer ? *calcTransfomer : (*calcProvider.Get())->GetCallableExecutionTransformer(); + status = SyncTransform(transformer, delegatedNode, ctx); + if (status.Level == IGraphTransformer::TStatus::Error) { + return nullptr; + } + + yson = TString{delegatedNode->GetResult().Content()}; + ysonNode = NYT::NodeFromYsonString(yson); } - TString yson{delegatedNode->GetResult().Content()}; - ysonNode = NYT::NodeFromYsonString(yson); if (ysonNode.HasKey("FallbackProvider")) { nextProvider = ysonNode["FallbackProvider"].AsString(); } else if (types.QContext.CanWrite()) { |