Skip to content

Commit bfadc55

Browse files
Added another cost based optimization level (#8348)
1 parent c3dbb7f commit bfadc55

File tree

13 files changed

+417
-345
lines changed

13 files changed

+417
-345
lines changed

ydb/core/kqp/opt/kqp_statistics_transformer.cpp

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ void InferStatisticsForReadTable(const TExprNode::TPtr& input, TTypeAnnotationCo
7979
byteSize,
8080
0.0,
8181
keyColumns,
82-
inputStats->ColumnStatistics);
82+
inputStats->ColumnStatistics,
83+
inputStats->StorageType);
8384

8485
YQL_CLOG(TRACE, CoreDq) << "Infer statistics for read table" << stats->ToString();
8586

@@ -119,6 +120,19 @@ void InferStatisticsForKqpTable(const TExprNode::TPtr& input, TTypeAnnotationCon
119120
}
120121
}
121122

123+
EStorageType storageType = EStorageType::NA;
124+
switch (tableData.Metadata->Kind) {
125+
case EKikimrTableKind::Datashard:
126+
storageType = EStorageType::RowStorage;
127+
break;
128+
case EKikimrTableKind::Olap:
129+
storageType = EStorageType::ColumnStorage;
130+
break;
131+
default:
132+
break;
133+
}
134+
stats->StorageType = storageType;
135+
122136
YQL_CLOG(TRACE, CoreDq) << "Infer statistics for table: " << path.Value() << ": " << stats->ToString();
123137

124138
typeCtx->SetStats(input.Get(), stats);
@@ -151,7 +165,8 @@ void InferStatisticsForSteamLookup(const TExprNode::TPtr& input, TTypeAnnotation
151165
byteSize,
152166
0,
153167
inputStats->KeyColumns,
154-
inputStats->ColumnStatistics);
168+
inputStats->ColumnStatistics,
169+
inputStats->StorageType);
155170

156171
typeCtx->SetStats(input.Get(), res);
157172

@@ -195,7 +210,8 @@ void InferStatisticsForLookupTable(const TExprNode::TPtr& input, TTypeAnnotation
195210
byteSize,
196211
0,
197212
inputStats->KeyColumns,
198-
inputStats->ColumnStatistics));
213+
inputStats->ColumnStatistics,
214+
inputStats->StorageType));
199215
}
200216

201217
/**
@@ -250,7 +266,8 @@ void InferStatisticsForRowsSourceSettings(const TExprNode::TPtr& input, TTypeAnn
250266
byteSize,
251267
cost,
252268
keyColumns,
253-
inputStats->ColumnStatistics));
269+
inputStats->ColumnStatistics,
270+
inputStats->StorageType));
254271
}
255272

256273
/**
@@ -282,7 +299,8 @@ void InferStatisticsForReadTableIndexRanges(const TExprNode::TPtr& input, TTypeA
282299
inputStats->ByteSize,
283300
inputStats->Cost,
284301
indexColumnsPtr,
285-
inputStats->ColumnStatistics);
302+
inputStats->ColumnStatistics,
303+
inputStats->StorageType);
286304

287305
typeCtx->SetStats(input.Get(), stats);
288306

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ bool TKqpProviderContext::IsJoinApplicable(const std::shared_ptr<IBaseOptimizerN
148148

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

177177
switch(joinAlgo) {
178178
case EJoinAlgoType::LookupJoin:
179-
if (OptLevel == 2) {
179+
if (OptLevel == 3) {
180180
return -1;
181181
}
182182
return leftStats.Nrows + outputRows;
183183

184184
case EJoinAlgoType::LookupJoinReverse:
185-
if (OptLevel == 2) {
185+
if (OptLevel == 3) {
186186
return -1;
187187
}
188188
return rightStats.Nrows + outputRows;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,14 @@ class TKqpLogicalOptTransformer : public TOptimizeTransformerBase {
166166
}
167167

168168
TMaybeNode<TExprBase> RewriteEquiJoin(TExprBase node, TExprContext& ctx) {
169-
bool useCBO = Config->CostBasedOptimizationLevel.Get().GetOrElse(Config->DefaultCostBasedOptimizationLevel) == 3;
169+
bool useCBO = Config->CostBasedOptimizationLevel.Get().GetOrElse(Config->DefaultCostBasedOptimizationLevel) >= 2;
170170
TExprBase output = DqRewriteEquiJoin(node, KqpCtx.Config->GetHashJoinMode(), useCBO, ctx, TypesCtx, KqpCtx.JoinsCount);
171171
DumpAppliedRule("RewriteEquiJoin", node.Ptr(), output.Ptr(), ctx);
172172
return output;
173173
}
174174

175175
TMaybeNode<TExprBase> JoinToIndexLookup(TExprBase node, TExprContext& ctx) {
176-
bool useCBO = Config->CostBasedOptimizationLevel.Get().GetOrElse(Config->DefaultCostBasedOptimizationLevel) == 3;
176+
bool useCBO = Config->CostBasedOptimizationLevel.Get().GetOrElse(Config->DefaultCostBasedOptimizationLevel) >= 2;
177177
TExprBase output = KqpJoinToIndexLookup(node, ctx, KqpCtx, useCBO);
178178
DumpAppliedRule("JoinToIndexLookup", node.Ptr(), output.Ptr(), ctx);
179179
return output;

ydb/core/kqp/provider/yql_kikimr_settings.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ struct TKikimrConfiguration : public TKikimrSettings, public NCommon::TSettingDi
169169
bool EnableOltpSink = false;
170170
NKikimrConfig::TTableServiceConfig_EBlockChannelsMode BlockChannelsMode;
171171
bool EnableSpillingGenericQuery = false;
172-
ui32 DefaultCostBasedOptimizationLevel = 3;
172+
ui32 DefaultCostBasedOptimizationLevel = 4;
173173
bool EnableConstantFolding = true;
174174
ui64 DefaultEnableSpillingNodes = 0;
175175

0 commit comments

Comments
 (0)