From b6b1ace2a0cf50376dc584719f2ef299e990fd00 Mon Sep 17 00:00:00 2001 From: Ivan Lezhankin Date: Wed, 7 Aug 2024 10:25:38 +0300 Subject: [PATCH] Print proper column names for wide connections --- ydb/core/kqp/opt/kqp_query_plan.cpp | 55 +++++++++++++++++++---------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/ydb/core/kqp/opt/kqp_query_plan.cpp b/ydb/core/kqp/opt/kqp_query_plan.cpp index f9935c156ef5..0a20de208169 100644 --- a/ydb/core/kqp/opt/kqp_query_plan.cpp +++ b/ydb/core/kqp/opt/kqp_query_plan.cpp @@ -94,7 +94,7 @@ struct TSerializerCtx { const TIntrusivePtr tablesData, const TKikimrConfiguration::TPtr config, ui32 txCount, TVector> pureTxResults, - TTypeAnnotationContext& typeCtx, + TTypeAnnotationContext& typeCtx, TIntrusivePtr optCtx) : ExprCtx(exprCtx) , Cluster(cluster) @@ -348,7 +348,7 @@ class TxPlanSerializer { writer.WriteKey("Inputs"); writer.BeginList(); - + for (const auto& input : op.Inputs) { if (std::holds_alternative(input)) { @@ -461,6 +461,15 @@ class TxPlanSerializer { } void FillConnectionPlanNode(const TDqConnection& connection, TQueryPlanNode& planNode) { + TDqStageSettings settings = TDqStageSettings::Parse(connection.Output().Stage()); + auto GetNarrowColumnName = [&](const TString& wideColumnName) { + ui32 idx; + if (!TryFromString(wideColumnName, idx)) { + return wideColumnName; + } + return TString(settings.OutputNarrowType->GetItems()[idx]->GetName()); + }; + planNode.Type = EPlanNodeType::Connection; if (connection.Maybe()) { @@ -473,15 +482,23 @@ class TxPlanSerializer { planNode.TypeName = "HashShuffle"; auto& keyColumns = planNode.NodeInfo["KeyColumns"]; for (const auto& column : hashShuffle.Cast().KeyColumns()) { - keyColumns.AppendValue(TString(column.Value())); + if (settings.WideChannels) { + keyColumns.AppendValue(GetNarrowColumnName(TString(column.Value()))); + } else { + keyColumns.AppendValue(TString(column.Value())); + } } } else if (auto merge = connection.Maybe()) { planNode.TypeName = "Merge"; auto& sortColumns = planNode.NodeInfo["SortColumns"]; for (const auto& sortColumn : merge.Cast().SortColumns()) { TStringBuilder sortColumnDesc; - sortColumnDesc << sortColumn.Column().Value() << " (" - << sortColumn.SortDirection().Value() << ")"; + if (settings.WideChannels) { + sortColumnDesc << GetNarrowColumnName(TString(sortColumn.Column().Value())); + } else { + sortColumnDesc << sortColumn.Column().Value(); + } + sortColumnDesc << " (" << sortColumn.SortDirection().Value() << ")"; sortColumns.AppendValue(sortColumnDesc); } @@ -1376,7 +1393,7 @@ class TxPlanSerializer { TOperator op; op.Properties["Name"] = name; - + return AddOperator(planNode, name, std::move(op)); } @@ -1728,8 +1745,8 @@ class TxPlanSerializer { template void AddReadTableSettings( - TOperator& op, - const TReadTableSettings& readTableSettings, + TOperator& op, + const TReadTableSettings& readTableSettings, TTableRead& readInfo ) { auto settings = NYql::TKqpReadTableSettings::Parse(readTableSettings); @@ -1751,9 +1768,9 @@ class TxPlanSerializer { } if (settings.SequentialInFlight) { - op.Properties["Scan"] = "Sequential"; + op.Properties["Scan"] = "Sequential"; } else { - op.Properties["Scan"] = "Parallel"; + op.Properties["Scan"] = "Parallel"; } } @@ -1953,8 +1970,8 @@ TVector RemoveRedundantNodes(NJson::TJsonValue& plan, const T return {plan}; } -NJson::TJsonValue ReconstructQueryPlanRec(const NJson::TJsonValue& plan, - int operatorIndex, +NJson::TJsonValue ReconstructQueryPlanRec(const NJson::TJsonValue& plan, + int operatorIndex, const THashMap& planIndex, const THashMap& precomputes, int& nodeCounter) { @@ -1993,14 +2010,14 @@ NJson::TJsonValue ReconstructQueryPlanRec(const NJson::TJsonValue& plan, NJson::TJsonValue newOps; NJson::TJsonValue op; - op["Name"] = "TableLookup"; + op["Name"] = "TableLookup"; op["Columns"] = plan.GetMapSafe().at("Columns"); op["LookupKeyColumns"] = plan.GetMapSafe().at("LookupKeyColumns"); op["Table"] = plan.GetMapSafe().at("Table"); if (plan.GetMapSafe().contains("E-Cost")) { op["E-Cost"] = plan.GetMapSafe().at("E-Cost"); - } + } if (plan.GetMapSafe().contains("E-Rows")) { op["E-Rows"] = plan.GetMapSafe().at("E-Rows"); } @@ -2075,8 +2092,8 @@ NJson::TJsonValue ReconstructQueryPlanRec(const NJson::TJsonValue& plan, op.GetMapSafe().erase("Inputs"); } - if (op.GetMapSafe().contains("Input") - || op.GetMapSafe().contains("ToFlow") + if (op.GetMapSafe().contains("Input") + || op.GetMapSafe().contains("ToFlow") || op.GetMapSafe().contains("Member") || op.GetMapSafe().contains("AssumeSorted") || op.GetMapSafe().contains("Iterator")) { @@ -2149,7 +2166,7 @@ double ComputeCpuTimes(NJson::TJsonValue& plan) { } void ComputeTotalRows(NJson::TJsonValue& plan) { - + if (plan.GetMapSafe().contains("Plans")) { for (auto& p : plan.GetMapSafe().at("Plans").GetArraySafe()) { ComputeTotalRows(p); @@ -2201,7 +2218,7 @@ NJson::TJsonValue SimplifyQueryPlan(NJson::TJsonValue& plan) { "ToFlow", "Member", "AssumeSorted" - }; + }; THashMap planIndex; THashMap precomputes; @@ -2237,7 +2254,7 @@ TString AddSimplifiedPlan(const TString& planText, TIntrusivePtrJoinsCount; optimizerStats["EquiJoinsCount"] = optCtx->EquiJoinsCount; simplifiedPlan["OptimizerStats"] = optimizerStats; - } + } planJson["SimplifiedPlan"] = simplifiedPlan; return planJson.GetStringRobust();