diff --git a/ydb/core/kqp/opt/kqp_statistics_transformer.cpp b/ydb/core/kqp/opt/kqp_statistics_transformer.cpp index 22fec88eb71b..a5594b43c8b8 100644 --- a/ydb/core/kqp/opt/kqp_statistics_transformer.cpp +++ b/ydb/core/kqp/opt/kqp_statistics_transformer.cpp @@ -55,7 +55,7 @@ void InferStatisticsForKqpTable(const TExprNode::TPtr& input, TTypeAnnotationCon const auto& tableData = kqpCtx.Tables->ExistingTable(kqpCtx.Cluster, path.Value()); double nRows = tableData.Metadata->RecordsCount; int nAttrs = tableData.Metadata->Columns.size(); - YQL_CLOG(TRACE, CoreDq) << "Infer statistics for table: " << path.Value() << ", nrows: " << nRows << ", nattrs: " << nAttrs; + YQL_CLOG(TRACE, CoreDq) << "Infer statistics for table: " << path.Value() << ", nrows: " << nRows << ", nattrs: " << nAttrs << ", nKeyColumns: " << tableData.Metadata->KeyColumnNames.size(); auto outputStats = TOptimizerStatistics(EStatisticsType::BaseTable, nRows, nAttrs, 0.0, tableData.Metadata->KeyColumnNames); typeCtx->SetStats(input.Get(), std::make_shared(outputStats)); diff --git a/ydb/library/yql/core/yql_cost_function.cpp b/ydb/library/yql/core/yql_cost_function.cpp index a5f0edf21dd6..58eb22fd0c59 100644 --- a/ydb/library/yql/core/yql_cost_function.cpp +++ b/ydb/library/yql/core/yql_cost_function.cpp @@ -41,9 +41,11 @@ TOptimizerStatistics NYql::ComputeJoinStats(const TOptimizerStatistics& leftStat double newCard; EStatisticsType outputType; + TVector joinedTableKeys; if (IsPKJoin(rightStats,rightJoinKeys)) { newCard = std::max(leftStats.Nrows,rightStats.Nrows); + joinedTableKeys = leftStats.KeyColumns; if (leftStats.Type == EStatisticsType::BaseTable){ outputType = EStatisticsType::FilteredFactTable; } else { @@ -52,6 +54,7 @@ TOptimizerStatistics NYql::ComputeJoinStats(const TOptimizerStatistics& leftStat } else if (IsPKJoin(leftStats,leftJoinKeys)) { newCard = std::max(leftStats.Nrows,rightStats.Nrows); + joinedTableKeys = rightStats.KeyColumns; if (rightStats.Type == EStatisticsType::BaseTable){ outputType = EStatisticsType::FilteredFactTable; } else { @@ -69,7 +72,7 @@ TOptimizerStatistics NYql::ComputeJoinStats(const TOptimizerStatistics& leftStat + newCard + leftStats.Cost + rightStats.Cost; - return TOptimizerStatistics(outputType, newCard, newNCols, cost); + return TOptimizerStatistics(outputType, newCard, newNCols, cost, joinedTableKeys); } TOptimizerStatistics NYql::ComputeJoinStats(const TOptimizerStatistics& leftStats, const TOptimizerStatistics& rightStats, diff --git a/ydb/library/yql/dq/opt/dq_opt_stat.cpp b/ydb/library/yql/dq/opt/dq_opt_stat.cpp index 755b60dc0c46..747bda5ca5dc 100644 --- a/ydb/library/yql/dq/opt/dq_opt_stat.cpp +++ b/ydb/library/yql/dq/opt/dq_opt_stat.cpp @@ -194,7 +194,7 @@ void InferStatisticsForFlatMap(const TExprNode::TPtr& input, TTypeAnnotationCont double selectivity = ComputePredicateSelectivity(flatmap.Lambda().Body(), inputStats); - auto outputStats = TOptimizerStatistics(inputStats->Type, inputStats->Nrows * selectivity, inputStats->Ncols, inputStats->Cost ); + auto outputStats = TOptimizerStatistics(inputStats->Type, inputStats->Nrows * selectivity, inputStats->Ncols, inputStats->Cost, inputStats->KeyColumns ); typeCtx->SetStats(input.Get(), std::make_shared(outputStats) ); } @@ -235,7 +235,7 @@ void InferStatisticsForFilter(const TExprNode::TPtr& input, TTypeAnnotationConte double selectivity = ComputePredicateSelectivity(filterBody, inputStats); - auto outputStats = TOptimizerStatistics(inputStats->Type, inputStats->Nrows * selectivity, inputStats->Ncols, inputStats->Cost); + auto outputStats = TOptimizerStatistics(inputStats->Type, inputStats->Nrows * selectivity, inputStats->Ncols, inputStats->Cost, inputStats->KeyColumns); typeCtx->SetStats(input.Get(), std::make_shared(outputStats) ); }