aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvvvv <vvvv@yandex-team.com>2025-01-10 13:51:46 +0300
committervvvv <vvvv@yandex-team.com>2025-01-10 14:39:55 +0300
commita4609b4071a963b34a56c7d8d032a24963b56477 (patch)
treec4e30593e82bea22737b6d9ac9b377fd181bbade
parentb830866dd04884b8eec69bab3c745c7c25ecb3f4 (diff)
downloadydb-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.cpp132
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()) {