Skip to content

Commit c6c9e71

Browse files
committed
Implement indexlookupjoin for non-point selection (#2298)
1 parent 179a3cb commit c6c9e71

18 files changed

+967
-255
lines changed

ydb/core/kqp/compile_service/kqp_compile_actor.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,8 @@ void ApplyServiceConfig(TKikimrConfiguration& kqpConfig, const TTableServiceConf
506506
kqpConfig.IndexAutoChooserMode = serviceConfig.GetIndexAutoChooseMode();
507507
kqpConfig.EnablePgConstsToParams = serviceConfig.GetEnablePgConstsToParams();
508508
kqpConfig.ExtractPredicateRangesLimit = serviceConfig.GetExtractPredicateRangesLimit();
509+
kqpConfig.IdxLookupJoinsPrefixPointLimit = serviceConfig.GetIdxLookupJoinPointsLimit();
510+
kqpConfig.OldLookupJoinBehaviour = serviceConfig.GetOldLookupJoinBehaviour();
509511

510512
if (const auto limit = serviceConfig.GetResourceManager().GetMkqlHeavyProgramMemoryLimit()) {
511513
kqpConfig._KqpYqlCombinerMemoryLimit = std::max(1_GB, limit - (limit >> 2U));

ydb/core/kqp/compile_service/kqp_compile_service.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,8 @@ class TKqpCompileService : public TActorBootstrapped<TKqpCompileService> {
474474
auto indexAutoChooser = TableServiceConfig.GetIndexAutoChooseMode();
475475

476476
ui64 rangesLimit = TableServiceConfig.GetExtractPredicateRangesLimit();
477+
ui64 idxLookupPointsLimit = TableServiceConfig.GetIdxLookupJoinPointsLimit();
478+
bool oldLookupJoinBehaviour = TableServiceConfig.GetOldLookupJoinBehaviour();
477479

478480
bool enableSequences = TableServiceConfig.GetEnableSequences();
479481
bool enableColumnsWithDefault = TableServiceConfig.GetEnableColumnsWithDefault();
@@ -503,8 +505,10 @@ class TKqpCompileService : public TActorBootstrapped<TKqpCompileService> {
503505
TableServiceConfig.GetEnableSequences() != enableSequences ||
504506
TableServiceConfig.GetEnableColumnsWithDefault() != enableColumnsWithDefault ||
505507
TableServiceConfig.GetEnableOlapSink() != enableOlapSink ||
508+
TableServiceConfig.GetOldLookupJoinBehaviour() != oldLookupJoinBehaviour ||
506509
TableServiceConfig.GetExtractPredicateRangesLimit() != rangesLimit ||
507-
TableServiceConfig.GetResourceManager().GetMkqlHeavyProgramMemoryLimit() != mkqlHeavyLimit) {
510+
TableServiceConfig.GetResourceManager().GetMkqlHeavyProgramMemoryLimit() != mkqlHeavyLimit ||
511+
TableServiceConfig.GetIdxLookupJoinPointsLimit() != idxLookupPointsLimit) {
508512

509513
QueryCache.Clear();
510514

ydb/core/kqp/expr_nodes/kqp_expr_nodes.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,9 @@
104104
"Base": "TKqlReadTableRangesBase",
105105
"Match": {"Type": "Callable", "Name": "KqlReadTableRanges"},
106106
"Children": [
107-
{"Index": 5, "Name": "PrefixPointsExpr", "Type": "TExprBase", "Optional": true}
107+
{"Index": 5, "Name": "PrefixPointsExpr", "Type": "TExprBase", "Optional": true},
108+
{"Index": 6, "Name": "PredicateExpr", "Type": "TCoLambda", "Optional": true},
109+
{"Index": 7, "Name": "PredicateUsedColumns", "Type": "TCoAtomList", "Optional": true}
108110
]
109111
},
110112
{
@@ -131,7 +133,9 @@
131133
"Match": {"Type": "Callable", "Name": "TKqlReadTableIndexRanges"},
132134
"Children": [
133135
{"Index": 5, "Name": "Index", "Type": "TCoAtom"},
134-
{"Index": 6, "Name": "PrefixPointsExpr", "Type": "TExprBase", "Optional": true}
136+
{"Index": 6, "Name": "PrefixPointsExpr", "Type": "TExprBase", "Optional": true},
137+
{"Index": 7, "Name": "PredicateExpr", "Type": "TCoLambda", "Optional": true},
138+
{"Index": 8, "Name": "PredicateUsedColumns", "Type": "TCoAtomList", "Optional": true}
135139
]
136140
},
137141
{

ydb/core/kqp/host/kqp_type_ann.cpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ TStatus AnnotateReadTableRanges(const TExprNode::TPtr& node, TExprContext& ctx,
340340
size_t argCount = (olapTable || index) ? 6 : 5;
341341

342342
// prefix
343-
if (!EnsureMinArgsCount(*node, argCount, ctx) && EnsureMaxArgsCount(*node, argCount + 1, ctx)) {
343+
if (!EnsureMinArgsCount(*node, argCount, ctx) && EnsureMaxArgsCount(*node, argCount + 3, ctx)) {
344344
return TStatus::Error;
345345
}
346346

@@ -375,8 +375,34 @@ TStatus AnnotateReadTableRanges(const TExprNode::TPtr& node, TExprContext& ctx,
375375
}
376376

377377
if (TKqlReadTableRanges::Match(node.Get())) {
378+
if (node->ChildrenSize() > TKqlReadTableRanges::idx_PredicateExpr) {
379+
auto& lambda = node->ChildRef(TKqlReadTableRanges::idx_PredicateExpr);
380+
auto rowType = GetReadTableRowType(ctx, tablesData, cluster, table.first, node->Pos(), withSystemColumns);
381+
if (!rowType) {
382+
return TStatus::Error;
383+
}
384+
if (!UpdateLambdaAllArgumentsTypes(lambda, {rowType}, ctx)) {
385+
return IGraphTransformer::TStatus::Error;
386+
}
387+
if (!lambda->GetTypeAnn()) {
388+
return IGraphTransformer::TStatus::Repeat;
389+
}
390+
}
378391
node->SetTypeAnn(ctx.MakeType<TListExprType>(rowType));
379392
} else if (TKqlReadTableIndexRanges::Match(node.Get())) {
393+
if (node->ChildrenSize() > TKqlReadTableIndexRanges::idx_PredicateExpr) {
394+
auto& lambda = node->ChildRef(TKqlReadTableIndexRanges::idx_PredicateExpr);
395+
auto rowType = GetReadTableRowType(ctx, tablesData, cluster, table.first, node->Pos(), withSystemColumns);
396+
if (!rowType) {
397+
return TStatus::Error;
398+
}
399+
if (!UpdateLambdaAllArgumentsTypes(lambda, {rowType}, ctx)) {
400+
return IGraphTransformer::TStatus::Error;
401+
}
402+
if (!lambda->GetTypeAnn()) {
403+
return IGraphTransformer::TStatus::Repeat;
404+
}
405+
}
380406
node->SetTypeAnn(ctx.MakeType<TListExprType>(rowType));
381407
} else if (TKqpReadTableRanges::Match(node.Get())) {
382408
node->SetTypeAnn(ctx.MakeType<TFlowExprType>(rowType));

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,25 @@ using namespace NYql::NNodes;
1414

1515
namespace {
1616

17+
TMaybeNode<TKqlKeyInc> GetRightTableKeyPrefix(const TKqlKeyRange& range) {
18+
if (!range.From().Maybe<TKqlKeyInc>() || !range.To().Maybe<TKqlKeyInc>()) {
19+
return {};
20+
}
21+
auto rangeFrom = range.From().Cast<TKqlKeyInc>();
22+
auto rangeTo = range.To().Cast<TKqlKeyInc>();
23+
24+
if (rangeFrom.ArgCount() != rangeTo.ArgCount()) {
25+
return {};
26+
}
27+
for (ui32 i = 0; i < rangeFrom.ArgCount(); ++i) {
28+
if (rangeFrom.Arg(i).Raw() != rangeTo.Arg(i).Raw()) {
29+
return {};
30+
}
31+
}
32+
33+
return rangeFrom;
34+
}
35+
1736
/**
1837
* KQP specific rule to check if a LookupJoin is applicable
1938
*/
@@ -163,4 +182,4 @@ double TKqpProviderContext::ComputeJoinCost(const TOptimizerStatistics& leftStat
163182
}
164183

165184

166-
}
185+
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,20 +86,20 @@ class TKqpLogicalOptTransformer : public TOptimizeTransformerBase {
8686
return output;
8787
}
8888

89-
TMaybeNode<TExprBase> PushExtractedPredicateToReadTable(TExprBase node, TExprContext& ctx) {
89+
TMaybeNode<TExprBase> PushExtractedPredicateToReadTable(TExprBase node, TExprContext& ctx, const TGetParents& getParents) {
9090
if (!KqpCtx.Config->PredicateExtract20) {
9191
return node;
9292
}
93-
TExprBase output = KqpPushExtractedPredicateToReadTable(node, ctx, KqpCtx, TypesCtx);
93+
TExprBase output = KqpPushExtractedPredicateToReadTable(node, ctx, KqpCtx, TypesCtx, *getParents());
9494
DumpAppliedRule("PushExtractedPredicateToReadTable", node.Ptr(), output.Ptr(), ctx);
9595
return output;
9696
}
9797

98-
TMaybeNode<TExprBase> LatePushExtractedPredicateToReadTable(TExprBase node, TExprContext& ctx) {
98+
TMaybeNode<TExprBase> LatePushExtractedPredicateToReadTable(TExprBase node, TExprContext& ctx, const TGetParents& getParents) {
9999
if (KqpCtx.Config->PredicateExtract20) {
100100
return node;
101101
}
102-
TExprBase output = KqpPushExtractedPredicateToReadTable(node, ctx, KqpCtx, TypesCtx);
102+
TExprBase output = KqpPushExtractedPredicateToReadTable(node, ctx, KqpCtx, TypesCtx, *getParents());
103103
DumpAppliedRule("PushExtractedPredicateToReadTable", node.Ptr(), output.Ptr(), ctx);
104104
return output;
105105
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ TExprBase KqpApplyExtractMembersToReadTableRanges(TExprBase node, TExprContext&
121121
.ExplainPrompt(read.ExplainPrompt())
122122
.Index(index.Index().Cast())
123123
.PrefixPointsExpr(index.PrefixPointsExpr())
124+
.PredicateExpr(index.PredicateExpr())
125+
.PredicateUsedColumns(index.PredicateUsedColumns())
124126
.Done();
125127
}
126128

@@ -132,6 +134,8 @@ TExprBase KqpApplyExtractMembersToReadTableRanges(TExprBase node, TExprContext&
132134
.Settings(read.Settings())
133135
.ExplainPrompt(read.ExplainPrompt())
134136
.PrefixPointsExpr(readRange.PrefixPointsExpr())
137+
.PredicateExpr(readRange.PredicateExpr())
138+
.PredicateUsedColumns(readRange.PredicateUsedColumns())
135139
.Done();
136140
}
137141

0 commit comments

Comments
 (0)