Skip to content

Commit 989a4fa

Browse files
authored
[CBO] Remove shared_ptr<> from Statistics (#10625)
1 parent 2d88397 commit 989a4fa

17 files changed

+146
-107
lines changed

ydb/core/kqp/opt/logical/kqp_opt_cbo.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ bool IsLookupJoinApplicableDetailed(const std::shared_ptr<NYql::TRelOptimizerNod
4545
return false;
4646
}
4747

48-
if (std::find_if(joinColumns.begin(), joinColumns.end(), [&] (const TJoinColumn& c) { return node->Stats->KeyColumns->Data[0] == c.AttributeName;}) != joinColumns.end()) {
48+
if (std::find_if(joinColumns.begin(), joinColumns.end(), [&] (const TJoinColumn& c) { return node->Stats.KeyColumns->Data[0] == c.AttributeName;}) != joinColumns.end()) {
4949
return true;
5050
}
5151

@@ -97,8 +97,8 @@ bool IsLookupJoinApplicableDetailed(const std::shared_ptr<NYql::TRelOptimizerNod
9797
return false;
9898
}
9999

100-
if (prefixSize < node->Stats->KeyColumns->Data.size() && (std::find_if(joinColumns.begin(), joinColumns.end(), [&] (const TJoinColumn& c) {
101-
return node->Stats->KeyColumns->Data[prefixSize] == c.AttributeName;
100+
if (prefixSize < node->Stats.KeyColumns->Data.size() && (std::find_if(joinColumns.begin(), joinColumns.end(), [&] (const TJoinColumn& c) {
101+
return node->Stats.KeyColumns->Data[prefixSize] == c.AttributeName;
102102
}) == joinColumns.end())){
103103
return false;
104104
}
@@ -114,22 +114,22 @@ bool IsLookupJoinApplicable(std::shared_ptr<IBaseOptimizerNode> left,
114114
) {
115115
Y_UNUSED(left, leftJoinKeys);
116116

117-
if (!(right->Stats->StorageType == EStorageType::RowStorage)) {
117+
if (!(right->Stats.StorageType == EStorageType::RowStorage)) {
118118
return false;
119119
}
120120

121121
auto rightStats = right->Stats;
122122

123-
if (!rightStats->KeyColumns) {
123+
if (!rightStats.KeyColumns) {
124124
return false;
125125
}
126126

127-
if (rightStats->Type != EStatisticsType::BaseTable) {
127+
if (rightStats.Type != EStatisticsType::BaseTable) {
128128
return false;
129129
}
130130

131131
for (auto rightCol : rightJoinKeys) {
132-
if (find(rightStats->KeyColumns->Data.begin(), rightStats->KeyColumns->Data.end(), rightCol.AttributeName) == rightStats->KeyColumns->Data.end()) {
132+
if (find(rightStats.KeyColumns->Data.begin(), rightStats.KeyColumns->Data.end(), rightCol.AttributeName) == rightStats.KeyColumns->Data.end()) {
133133
return false;
134134
}
135135
}
@@ -148,7 +148,7 @@ bool TKqpProviderContext::IsJoinApplicable(const std::shared_ptr<IBaseOptimizerN
148148

149149
switch( joinAlgo ) {
150150
case EJoinAlgoType::LookupJoin:
151-
if ((OptLevel != 3) && (left->Stats->Nrows > 1000)) {
151+
if ((OptLevel != 3) && (left->Stats.Nrows > 1000)) {
152152
return false;
153153
}
154154
return IsLookupJoinApplicable(left, right, leftJoinKeys, rightJoinKeys, *this);
@@ -157,13 +157,13 @@ bool TKqpProviderContext::IsJoinApplicable(const std::shared_ptr<IBaseOptimizerN
157157
if (joinKind != EJoinKind::LeftSemi) {
158158
return false;
159159
}
160-
if ((OptLevel != 3) && (right->Stats->Nrows > 1000)) {
160+
if ((OptLevel != 3) && (right->Stats.Nrows > 1000)) {
161161
return false;
162162
}
163163
return IsLookupJoinApplicable(right, left, rightJoinKeys, leftJoinKeys, *this);
164164

165165
case EJoinAlgoType::MapJoin:
166-
return joinKind != EJoinKind::OuterJoin && joinKind != EJoinKind::Exclusion && right->Stats->ByteSize < 1e6;
166+
return joinKind != EJoinKind::OuterJoin && joinKind != EJoinKind::Exclusion && right->Stats.ByteSize < 1e6;
167167
case EJoinAlgoType::GraceJoin:
168168
return true;
169169
default:

ydb/core/kqp/opt/logical/kqp_opt_cbo.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ namespace NKikimr::NKqp::NOpt {
1313
struct TKqpRelOptimizerNode : public NYql::TRelOptimizerNode {
1414
const NYql::TExprNode::TPtr Node;
1515

16-
TKqpRelOptimizerNode(TString label, std::shared_ptr<NYql::TOptimizerStatistics> stats, const NYql::TExprNode::TPtr node) :
17-
TRelOptimizerNode(label, stats), Node(node) { }
16+
TKqpRelOptimizerNode(TString label, NYql::TOptimizerStatistics stats, const NYql::TExprNode::TPtr node) :
17+
TRelOptimizerNode(label, std::move(stats)), Node(node) { }
1818
};
1919

2020
/**

ydb/core/kqp/opt/logical/kqp_opt_log.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ class TKqpLogicalOptTransformer : public TOptimizeTransformerBase {
166166
auto opt = std::unique_ptr<IOptimizerNew>(MakeNativeOptimizerNew(providerCtx, maxDPccpDPTableSize));
167167
TExprBase output = DqOptimizeEquiJoinWithCosts(node, ctx, TypesCtx, optLevel,
168168
*opt, [](auto& rels, auto label, auto node, auto stat) {
169-
rels.emplace_back(std::make_shared<TKqpRelOptimizerNode>(TString(label), stat, node));
169+
rels.emplace_back(std::make_shared<TKqpRelOptimizerNode>(TString(label), *stat, node));
170170
},
171171
KqpCtx.EquiJoinsCount,
172172
KqpCtx.GetOptimizerHints()

ydb/library/yql/core/cbo/cbo_optimizer_new.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ void TRelOptimizerNode::Print(std::stringstream& stream, int ntabs) {
7171
for (int i = 0; i < ntabs; i++){
7272
stream << " ";
7373
}
74-
stream << *Stats << "\n";
74+
stream << Stats << "\n";
7575
}
7676

7777
TJoinOptimizerNode::TJoinOptimizerNode(
@@ -124,12 +124,12 @@ void TJoinOptimizerNode::Print(std::stringstream& stream, int ntabs) {
124124
}
125125
stream << "\n";
126126

127-
if (Stats) {
128-
for (int i = 0; i < ntabs; i++){
129-
stream << " ";
130-
}
131-
stream << *Stats << "\n";
127+
128+
for (int i = 0; i < ntabs; i++){
129+
stream << " ";
132130
}
131+
stream << Stats << "\n";
132+
133133

134134
LeftArg->Print(stream, ntabs+1);
135135
RightArg->Print(stream, ntabs+1);

ydb/library/yql/core/cbo/cbo_optimizer_new.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ enum EOptimizerNodeKind: ui32
3131
*/
3232
struct IBaseOptimizerNode {
3333
EOptimizerNodeKind Kind;
34-
std::shared_ptr<TOptimizerStatistics> Stats;
34+
TOptimizerStatistics Stats;
3535

3636
IBaseOptimizerNode(EOptimizerNodeKind k) : Kind(k) {}
37-
IBaseOptimizerNode(EOptimizerNodeKind k, std::shared_ptr<TOptimizerStatistics> s) :
38-
Kind(k), Stats(s) {}
37+
IBaseOptimizerNode(EOptimizerNodeKind k, TOptimizerStatistics s) :
38+
Kind(k), Stats(std::move(s)) {}
3939

4040
virtual TVector<TString> Labels()=0;
4141
virtual void Print(std::stringstream& stream, int ntabs=0)=0;
@@ -254,8 +254,8 @@ struct TRelOptimizerNode : public IBaseOptimizerNode {
254254
// Temporary solution to check if a LookupJoin is possible in KQP
255255
//void* Expr;
256256

257-
TRelOptimizerNode(TString label, std::shared_ptr<TOptimizerStatistics> stats) :
258-
IBaseOptimizerNode(RelNodeType, stats), Label(label) { }
257+
TRelOptimizerNode(TString label, TOptimizerStatistics stats) :
258+
IBaseOptimizerNode(RelNodeType, std::move(stats)), Label(label) { }
259259
//TRelOptimizerNode(TString label, std::shared_ptr<TOptimizerStatistics> stats, const TExprNode::TPtr expr) :
260260
// IBaseOptimizerNode(RelNodeType, stats), Label(label), Expr(expr) { }
261261
virtual ~TRelOptimizerNode() {}

ydb/library/yql/core/yql_statistics.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,10 @@ struct TOptimizerStatistics {
7272
std::shared_ptr<TVector<TString>> Labels = {};
7373

7474
TOptimizerStatistics(TOptimizerStatistics&&) = default;
75-
TOptimizerStatistics() {}
75+
TOptimizerStatistics& operator=(TOptimizerStatistics&&) = default;
76+
TOptimizerStatistics(const TOptimizerStatistics&) = default;
77+
TOptimizerStatistics& operator=(const TOptimizerStatistics&) = default;
78+
TOptimizerStatistics() = default;
7679

7780
TOptimizerStatistics(
7881
EStatisticsType type,

ydb/library/yql/dq/opt/dq_cbo_ut.cpp

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,14 @@ Y_UNIT_TEST(JoinSearch2Rels) {
4040
TBaseProviderContext pctx;
4141
std::unique_ptr<IOptimizerNew> optimizer = std::unique_ptr<IOptimizerNew>(MakeNativeOptimizerNew(pctx, 100000));
4242

43-
auto rel1 = std::make_shared<TRelOptimizerNode>("a",
44-
std::make_shared<TOptimizerStatistics>(BaseTable, 100000, 1, 0, 1000000));
45-
auto rel2 = std::make_shared<TRelOptimizerNode>("b",
46-
std::make_shared<TOptimizerStatistics>(BaseTable, 1000000, 1, 0, 9000009));
43+
auto rel1 = std::make_shared<TRelOptimizerNode>(
44+
"a",
45+
TOptimizerStatistics(BaseTable, 100000, 1, 0, 1000000)
46+
);
47+
auto rel2 = std::make_shared<TRelOptimizerNode>(
48+
"b",
49+
TOptimizerStatistics(BaseTable, 1000000, 1, 0, 9000009)
50+
);
4751

4852
TVector<NDq::TJoinColumn> leftKeys = {NDq::TJoinColumn("a", "1")};
4953
TVector<NDq::TJoinColumn> rightKeys ={NDq::TJoinColumn("b", "1")};
@@ -79,11 +83,11 @@ Y_UNIT_TEST(JoinSearch3Rels) {
7983
std::unique_ptr<IOptimizerNew> optimizer = std::unique_ptr<IOptimizerNew>(MakeNativeOptimizerNew(pctx, 100000));
8084

8185
auto rel1 = std::make_shared<TRelOptimizerNode>("a",
82-
std::make_shared<TOptimizerStatistics>(BaseTable, 100000, 1, 0, 1000000));
86+
TOptimizerStatistics(BaseTable, 100000, 1, 0, 1000000));
8387
auto rel2 = std::make_shared<TRelOptimizerNode>("b",
84-
std::make_shared<TOptimizerStatistics>(BaseTable, 1000000, 1, 0, 9000009));
88+
TOptimizerStatistics(BaseTable, 1000000, 1, 0, 9000009));
8589
auto rel3 = std::make_shared<TRelOptimizerNode>("c",
86-
std::make_shared<TOptimizerStatistics>(BaseTable, 10000, 1, 0, 9009));
90+
TOptimizerStatistics(BaseTable, 10000, 1, 0, 9009));
8791

8892
TVector<NDq::TJoinColumn> leftKeys = {NDq::TJoinColumn("a", "1")};
8993
TVector<NDq::TJoinColumn> rightKeys ={NDq::TJoinColumn("b", "1")};
@@ -219,7 +223,7 @@ void _DqOptimizeEquiJoinWithCosts(const std::function<IOptimizerNew*()>& optFact
219223
auto opt = std::unique_ptr<IOptimizerNew>(optFactory());
220224
std::function<void(TVector<std::shared_ptr<TRelOptimizerNode>>&, TStringBuf, const TExprNode::TPtr, const std::shared_ptr<TOptimizerStatistics>&)> providerCollect = [](auto& rels, auto label, auto node, auto stats) {
221225
Y_UNUSED(node);
222-
auto rel = std::make_shared<TRelOptimizerNode>(TString(label), stats);
226+
auto rel = std::make_shared<TRelOptimizerNode>(TString(label), *stats);
223227
rels.push_back(rel);
224228
};
225229
auto res = DqOptimizeEquiJoinWithCosts(equiJoin, ctx, typeCtx, 2, *opt, providerCollect);

ydb/library/yql/dq/opt/dq_opt_dphyp_solver.h

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class TDPHypSolver {
101101
TJoinHypergraph<TNodeSet>& Graph_;
102102
size_t NNodes_;
103103
IProviderContext& Pctx_; // Provider specific contexts?
104-
// FIXME: This is a temporary structure that needs to be extended to multiple providers.
104+
// FIXME: This is a temporary structure that needs to be extended to multiple providers, also we need to remove virtual functions, they are really expensive.
105105
#ifndef NDEBUG
106106
THashMap<std::pair<TNodeSet, TNodeSet>, bool, pair_hash> CheckTable_;
107107
#endif
@@ -244,7 +244,7 @@ template<typename TNodeSet> std::shared_ptr<TJoinOptimizerNodeInternal> TDPHypSo
244244
s[i] = 1;
245245
DpTable_[s] = nodes[i].RelationOptimizerNode;
246246
if (CardHintsTable_.contains(s)){
247-
DpTable_[s]->Stats->Nrows = CardHintsTable_.at(s)->ApplyHint(DpTable_[s]->Stats->Nrows);
247+
DpTable_[s]->Stats.Nrows = CardHintsTable_.at(s)->ApplyHint(DpTable_[s]->Stats.Nrows);
248248
}
249249
}
250250

@@ -423,29 +423,33 @@ template <typename TNodeSet> std::shared_ptr<TJoinOptimizerNodeInternal> TDPHypS
423423
) {
424424
if (maybeJoinAlgoHint) {
425425
maybeJoinAlgoHint->Applied = true;
426-
return MakeJoinInternal(left, right, leftJoinKeys, rightJoinKeys, joinKind, maybeJoinAlgoHint->Algo, leftAny, rightAny, ctx, maybeCardHint);
426+
auto stats = ctx.ComputeJoinStats(left->Stats, right->Stats, leftJoinKeys, rightJoinKeys, maybeJoinAlgoHint->Algo, joinKind, maybeCardHint);
427+
return MakeJoinInternal(std::move(stats), left, right, leftJoinKeys, rightJoinKeys, joinKind, maybeJoinAlgoHint->Algo, leftAny, rightAny);
427428
}
428429

430+
TOptimizerStatistics bestJoinStats;
429431
double bestCost = std::numeric_limits<double>::infinity();
430432
EJoinAlgoType bestAlgo = EJoinAlgoType::Undefined;
431433
bool bestJoinIsReversed = false;
432434

433435
for (auto joinAlgo : AllJoinAlgos) {
434436
if (ctx.IsJoinApplicable(left, right, leftJoinKeys, rightJoinKeys, joinAlgo, joinKind)){
435-
auto cost = ctx.ComputeJoinStats(*left->Stats, *right->Stats, leftJoinKeys, rightJoinKeys, joinAlgo, joinKind, maybeCardHint).Cost;
436-
if (cost < bestCost) {
437-
bestCost = cost;
437+
auto stats = ctx.ComputeJoinStats(left->Stats, right->Stats, leftJoinKeys, rightJoinKeys, joinAlgo, joinKind, maybeCardHint);
438+
if (stats.Cost < bestCost) {
439+
bestCost = stats.Cost;
438440
bestAlgo = joinAlgo;
441+
bestJoinStats = std::move(stats);
439442
bestJoinIsReversed = false;
440443
}
441444
}
442445

443446
if (isCommutative) {
444447
if (ctx.IsJoinApplicable(right, left, rightJoinKeys, leftJoinKeys, joinAlgo, joinKind)){
445-
auto cost = ctx.ComputeJoinStats(*right->Stats, *left->Stats, rightJoinKeys, leftJoinKeys, joinAlgo, joinKind, maybeCardHint).Cost;
446-
if (cost < bestCost) {
447-
bestCost = cost;
448+
auto stats = ctx.ComputeJoinStats(right->Stats, left->Stats, rightJoinKeys, leftJoinKeys, joinAlgo, joinKind, maybeCardHint);
449+
if (stats.Cost < bestCost) {
450+
bestCost = stats.Cost;
448451
bestAlgo = joinAlgo;
452+
bestJoinStats = std::move(stats);
449453
bestJoinIsReversed = true;
450454
}
451455
}
@@ -455,10 +459,10 @@ template <typename TNodeSet> std::shared_ptr<TJoinOptimizerNodeInternal> TDPHypS
455459
Y_ENSURE(bestAlgo != EJoinAlgoType::Undefined, "No join was chosen!");
456460

457461
if (bestJoinIsReversed) {
458-
return MakeJoinInternal(right, left, rightJoinKeys, leftJoinKeys, joinKind, bestAlgo, rightAny, leftAny, ctx, maybeCardHint);
462+
return MakeJoinInternal(std::move(bestJoinStats), right, left, rightJoinKeys, leftJoinKeys, joinKind, bestAlgo, rightAny, leftAny);
459463
}
460464

461-
return MakeJoinInternal(left, right, leftJoinKeys, rightJoinKeys, joinKind, bestAlgo, leftAny, rightAny, ctx, maybeCardHint);
465+
return MakeJoinInternal(std::move(bestJoinStats), left, right, leftJoinKeys, rightJoinKeys, joinKind, bestAlgo, leftAny, rightAny);
462466
}
463467

464468
/*
@@ -503,7 +507,7 @@ template<typename TNodeSet> void TDPHypSolver<TNodeSet>::EmitCsgCmp(
503507
maybeJoinAlgoHint
504508
);
505509

506-
if (!DpTable_.contains(joined) || bestJoin->Stats->Cost < DpTable_[joined]->Stats->Cost) {
510+
if (!DpTable_.contains(joined) || bestJoin->Stats.Cost < DpTable_[joined]->Stats.Cost) {
507511
DpTable_[joined] = bestJoin;
508512
}
509513

0 commit comments

Comments
 (0)