aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Makunin <igor.makunin@gmail.com>2022-03-18 14:50:42 +0300
committerIgor Makunin <igor.makunin@gmail.com>2022-03-18 14:50:42 +0300
commit395dc6b898267eeedc05cb440827a22b6f71ec69 (patch)
treed98202520a91d4285f4b851379a09f4d251abc29
parentf0d8005960eb82e1a95c34577b3a8bd3cb3186cb (diff)
downloadydb-395dc6b898267eeedc05cb440827a22b6f71ec69.tar.gz
KIKIMR-14527: dont run exctract predicates on trivial ranges
ref:e3e615857a7c5039fb2621f3c40afe205e7c867a
-rw-r--r--ydb/core/kqp/opt/logical/kqp_opt_log_ranges.cpp4
-rw-r--r--ydb/core/kqp/opt/logical/kqp_opt_log_ranges_predext.cpp142
-rw-r--r--ydb/core/kqp/opt/logical/kqp_opt_log_rules.h7
-rw-r--r--ydb/core/kqp/opt/physical/kqp_opt_phy_build_stage.cpp2
-rw-r--r--ydb/core/kqp/ut/kqp_explain_ut.cpp6
-rw-r--r--ydb/core/kqp/ut/kqp_ne_flowcontrol_ut.cpp4
-rw-r--r--ydb/core/kqp/ut/kqp_ne_ut.cpp11
-rw-r--r--ydb/core/kqp/ut/kqp_scan_ut.cpp68
-rw-r--r--ydb/core/kqp/ut/kqp_stats_ut.cpp10
-rw-r--r--ydb/core/kqp/ut/kqp_table_predicate_ut.cpp2
-rw-r--r--ydb/core/tx/datashard/datashard_ut_kqp_scan.cpp1
11 files changed, 212 insertions, 45 deletions
diff --git a/ydb/core/kqp/opt/logical/kqp_opt_log_ranges.cpp b/ydb/core/kqp/opt/logical/kqp_opt_log_ranges.cpp
index acf6a707be3..16da537a400 100644
--- a/ydb/core/kqp/opt/logical/kqp_opt_log_ranges.cpp
+++ b/ydb/core/kqp/opt/logical/kqp_opt_log_ranges.cpp
@@ -62,6 +62,8 @@ TExprBase BuildEquiRangeLookup(const TKeyRange& keyRange, const TKikimrTableDesc
.Done();
}
+} // namespace
+
TKqlKeyRange BuildKeyRangeExpr(const TKeyRange& keyRange, const TKikimrTableDescription& tableDesc,
TPositionHandle pos, TExprContext& ctx)
{
@@ -113,8 +115,6 @@ TKqlKeyRange BuildKeyRangeExpr(const TKeyRange& keyRange, const TKikimrTableDesc
.Done();
}
-} // namespace
-
TExprBase KqpPushPredicateToReadTable(TExprBase node, TExprContext& ctx, const TKqpOptimizeContext& kqpCtx) {
if (!node.Maybe<TCoFlatMap>()) {
return node;
diff --git a/ydb/core/kqp/opt/logical/kqp_opt_log_ranges_predext.cpp b/ydb/core/kqp/opt/logical/kqp_opt_log_ranges_predext.cpp
index a4a4a0b3e0b..0bbb0d71cd5 100644
--- a/ydb/core/kqp/opt/logical/kqp_opt_log_ranges_predext.cpp
+++ b/ydb/core/kqp/opt/logical/kqp_opt_log_ranges_predext.cpp
@@ -16,6 +16,137 @@ using namespace NYql::NCommon;
using namespace NYql::NDq;
using namespace NYql::NNodes;
+namespace {
+
+TMaybeNode<TExprBase> TryBuildTrivialReadTable(TCoFlatMap& flatmap, TKqlReadTableRanges readTable,
+ TMaybeNode<TCoFilterNullMembers>& filterNull, TMaybeNode<TCoSkipNullMembers>& skipNull,
+ const TKikimrTableDescription& tableDesc, TExprContext& ctx, const TKqpOptimizeContext& kqpCtx)
+{
+ switch (tableDesc.Metadata->Kind) {
+ case EKikimrTableKind::Datashard:
+ case EKikimrTableKind::SysView:
+ break;
+ case EKikimrTableKind::Olap:
+ case EKikimrTableKind::Unspecified:
+ return {};
+ }
+
+ auto row = flatmap.Lambda().Args().Arg(0);
+ auto predicate = TExprBase(flatmap.Lambda().Body().Ref().ChildPtr(0));
+ TTableLookup lookup = ExtractTableLookup(row, predicate, tableDesc.Metadata->KeyColumnNames,
+ &KiTableLookupGetValue, &KiTableLookupCanCompare, &KiTableLookupCompare, ctx,
+ kqpCtx.Config->HasAllowNullCompareInIndex());
+
+ if (lookup.IsFullScan()) {
+ return {};
+ }
+
+ if (kqpCtx.IsScanQuery() && lookup.GetKeyRanges().size() > 1) {
+ return {}; // optimize trivial cases only
+ }
+
+ auto isTrivialExpr = [](const TExprBase& expr) {
+ if (!expr.Maybe<TCoExists>()) {
+ return false;
+ }
+ auto opt = expr.Cast<TCoExists>().Optional();
+ if (opt.Maybe<TCoDataCtor>()) {
+ return true;
+ }
+ if (opt.Maybe<TCoParameter>()) {
+ return opt.Ref().GetTypeAnn()->GetKind() == ETypeAnnotationKind::Data;
+ }
+ return false;
+ };
+
+ auto isTrivialPredicate = [&isTrivialExpr](const TExprBase& expr) {
+ if (isTrivialExpr(expr)) {
+ return true;
+ }
+ if (expr.Maybe<TCoAnd>()) {
+ for (auto& predicate : expr.Cast<TCoAnd>().Args()) {
+ if (!isTrivialExpr(TExprBase(predicate))) {
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
+ };
+
+ TVector<TExprBase> fetches;
+ fetches.reserve(lookup.GetKeyRanges().size());
+ auto readSettings = TKqpReadTableSettings::Parse(readTable);
+
+ for (const auto& keyRange : lookup.GetKeyRanges()) {
+ if (keyRange.HasResidualPredicate()) {
+ // In trivial cases the residual predicate look like:
+ // * (Exists <KeyValue>)
+ // * (And (Exists <Key1Value>) (Exists Key2Value) ...)
+ // where `KeyValue` is either explicit `Data` (so `Exists` is always true)
+ // or Parameter value (in that case we ensure that type is not optional)
+ if (!isTrivialPredicate(keyRange.GetResidualPredicate().Cast())) {
+ return {};
+ }
+ }
+
+ auto keyRangeExpr = BuildKeyRangeExpr(keyRange, tableDesc, readTable.Pos(), ctx);
+
+ TKqpReadTableSettings settings = readSettings;
+ for (size_t i = 0; i < keyRange.GetColumnRangesCount(); ++i) {
+ const auto& column = tableDesc.Metadata->KeyColumnNames[i];
+ auto& range = keyRange.GetColumnRange(i);
+ if (range.IsDefined() && !range.IsNull()) {
+ settings.AddSkipNullKey(column);
+ }
+ }
+
+ TExprBase input = Build<TKqlReadTable>(ctx, readTable.Pos())
+ .Table(readTable.Table())
+ .Range(keyRangeExpr)
+ .Columns(readTable.Columns())
+ .Settings(settings.BuildNode(ctx, readTable.Pos()))
+ .Done();
+
+ if (filterNull) {
+ input = Build<TCoFilterNullMembers>(ctx, readTable.Pos())
+ .Input(input)
+ .Members(filterNull.Cast().Members())
+ .Done();
+ }
+
+ if (skipNull) {
+ input = Build<TCoSkipNullMembers>(ctx, readTable.Pos())
+ .Input(input)
+ .Members(skipNull.Cast().Members())
+ .Done();
+ }
+
+ input = Build<TCoFlatMap>(ctx, readTable.Pos())
+ .Input(input)
+ .Lambda()
+ .Args({"item"})
+ .Body<TExprApplier>()
+ .Apply(TExprBase(ctx.ChangeChild(flatmap.Lambda().Body().Ref(), 0, MakeBool<true>(readTable.Pos(), ctx))))
+ .With(flatmap.Lambda().Args().Arg(0), "item")
+ .Build()
+ .Build()
+ .Done();
+
+ if (lookup.GetKeyRanges().size() == 1) {
+ return input;
+ }
+
+ fetches.emplace_back(input);
+ }
+
+ return Build<TCoExtend>(ctx, readTable.Pos())
+ .Add(fetches)
+ .Done();
+}
+
+} // namespace
+
TExprBase KqpPushExtractedPredicateToReadTable(TExprBase node, TExprContext& ctx, const TKqpOptimizeContext& kqpCtx,
TTypeAnnotationContext& typesCtx)
{
@@ -67,7 +198,12 @@ TExprBase KqpPushExtractedPredicateToReadTable(TExprBase node, TExprContext& ctx
return node;
}
- auto& tableDesc = kqpCtx.Tables->ExistingTable(kqpCtx.Cluster, read.Table().Path());
+ const auto& tableDesc = kqpCtx.Tables->ExistingTable(kqpCtx.Cluster, read.Table().Path());
+
+ // test for trivial cases (explicit literals or parameters)
+ if (auto expr = TryBuildTrivialReadTable(flatmap, read, filterNull, skipNull, tableDesc, ctx, kqpCtx)) {
+ return expr.Cast();
+ }
THashSet<TString> possibleKeys;
TPredicateExtractorSettings settings;
@@ -103,7 +239,7 @@ TExprBase KqpPushExtractedPredicateToReadTable(TExprBase node, TExprContext& ctx
YQL_CLOG(DEBUG, ProviderKqp) << "Ranges extracted: " << KqpExprToPrettyString(*ranges, ctx);
YQL_CLOG(DEBUG, ProviderKqp) << "Residual lambda: " << KqpExprToPrettyString(*residualLambda, ctx);
- TMaybeNode<TExprBase> readInput = Build<TKqlReadTableRanges>(ctx, read.Pos())
+ TExprBase input = Build<TKqlReadTableRanges>(ctx, read.Pos())
.Table(read.Table())
.Ranges(ranges)
.Columns(read.Columns())
@@ -111,8 +247,6 @@ TExprBase KqpPushExtractedPredicateToReadTable(TExprBase node, TExprContext& ctx
.ExplainPrompt(prompt.BuildNode(ctx, read.Pos()))
.Done();
- auto input = readInput.Cast();
-
if (filterNull) {
input = Build<TCoFilterNullMembers>(ctx, node.Pos())
.Input(input)
diff --git a/ydb/core/kqp/opt/logical/kqp_opt_log_rules.h b/ydb/core/kqp/opt/logical/kqp_opt_log_rules.h
index ae001c4d9c0..a0080e93630 100644
--- a/ydb/core/kqp/opt/logical/kqp_opt_log_rules.h
+++ b/ydb/core/kqp/opt/logical/kqp_opt_log_rules.h
@@ -9,8 +9,15 @@
* This file contains declaration of all rule functions for logical optimizer
*/
+namespace NYql::NCommon {
+ class TKeyRange;
+}
+
namespace NKikimr::NKqp::NOpt {
+NYql::NNodes::TKqlKeyRange BuildKeyRangeExpr(const NYql::NCommon::TKeyRange& keyRange,
+ const NYql::TKikimrTableDescription& tableDesc, NYql::TPositionHandle pos, NYql::TExprContext& ctx);
+
NYql::NNodes::TExprBase KqpPushPredicateToReadTable(NYql::NNodes::TExprBase node, NYql::TExprContext &ctx,
const TKqpOptimizeContext &kqpCtx);
diff --git a/ydb/core/kqp/opt/physical/kqp_opt_phy_build_stage.cpp b/ydb/core/kqp/opt/physical/kqp_opt_phy_build_stage.cpp
index e2acb699731..4cb047c2682 100644
--- a/ydb/core/kqp/opt/physical/kqp_opt_phy_build_stage.cpp
+++ b/ydb/core/kqp/opt/physical/kqp_opt_phy_build_stage.cpp
@@ -73,7 +73,7 @@ TExprBase KqpBuildReadTableStage(TExprBase node, TExprContext& ctx, const TKqpOp
return false;
}
- if (!value.Maybe<TCoDataCtor>()) {
+ if (!value.Maybe<TCoDataCtor>() && !value.Maybe<TCoParameter>()) {
literalRange = false;
}
diff --git a/ydb/core/kqp/ut/kqp_explain_ut.cpp b/ydb/core/kqp/ut/kqp_explain_ut.cpp
index c3a06836367..e9b9c9880a9 100644
--- a/ydb/core/kqp/ut/kqp_explain_ut.cpp
+++ b/ydb/core/kqp/ut/kqp_explain_ut.cpp
@@ -195,7 +195,7 @@ Y_UNIT_TEST_SUITE(KqpExplain) {
settings.Explain(true);
auto it = db.StreamExecuteScanQuery(R"(
- SELECT * FROM `/Root/EightShard` WHERE Key BETWEEN 150 AND 266 ORDER BY Data LIMIT 4;
+ SELECT * FROM `/Root/EightShard` WHERE Key BETWEEN 149 + 1 AND 266 ORDER BY Data LIMIT 4;
)", settings).GetValueSync();
auto res = CollectStreamResult(it);
@@ -262,7 +262,7 @@ Y_UNIT_TEST_SUITE(KqpExplain) {
NJson::TJsonValue plan;
NJson::ReadJsonTree(*res.PlanJson, &plan, true);
- auto scanSort = FindPlanNodeByKv(plan, "Node Type", "Sort-TableRangesScan");
+ auto scanSort = FindPlanNodeByKv(plan, "Node Type", "Sort-TableRangeScan");
UNIT_ASSERT(scanSort.IsDefined());
}
@@ -626,7 +626,7 @@ Y_UNIT_TEST_SUITE(KqpExplain) {
auto it = db.StreamExecuteScanQuery(R"(
SELECT * FROM `/Root/KeyValue`
- WHERE Key >= 2000 OR Key < 100;
+ WHERE Key >= 2000 OR Key < 99 + 1;
)", settings).GetValueSync();
auto res = CollectStreamResult(it);
diff --git a/ydb/core/kqp/ut/kqp_ne_flowcontrol_ut.cpp b/ydb/core/kqp/ut/kqp_ne_flowcontrol_ut.cpp
index 16c89eceb58..9c3d839d6d7 100644
--- a/ydb/core/kqp/ut/kqp_ne_flowcontrol_ut.cpp
+++ b/ydb/core/kqp/ut/kqp_ne_flowcontrol_ut.cpp
@@ -91,10 +91,10 @@ void DoFlowControlTest(ui64 limit, bool hasBlockedByCapacity) {
[[302u];["Value2"];["Value-302"]]
])", StreamResultToYson(result, &profiles));
- UNIT_ASSERT_EQUAL(2, profiles.size());
+ UNIT_ASSERT_EQUAL(1, profiles.size());
NYql::NDqProto::TDqExecutionStats stats;
- google::protobuf::TextFormat::ParseFromString(profiles[1], &stats);
+ google::protobuf::TextFormat::ParseFromString(profiles[0], &stats);
UNIT_ASSERT(stats.IsInitialized());
ui32 blockedByCapacity = 0;
diff --git a/ydb/core/kqp/ut/kqp_ne_ut.cpp b/ydb/core/kqp/ut/kqp_ne_ut.cpp
index 58ff185761a..925fd219540 100644
--- a/ydb/core/kqp/ut/kqp_ne_ut.cpp
+++ b/ydb/core/kqp/ut/kqp_ne_ut.cpp
@@ -3041,7 +3041,7 @@ Y_UNIT_TEST_SUITE(KqpNewEngine) {
UNIT_ASSERT_VALUES_EQUAL(1, stats.query_phases()[0].affected_shards());
UNIT_ASSERT_VALUES_EQUAL("/Root/Logs", stats.query_phases()[0].table_access()[0].name());
- // mix param and literal
+ // mix non-optional param and literal
auto params = TParamsBuilder()
.AddParam("$app").Utf8("nginx").Build()
.Build();
@@ -3058,11 +3058,10 @@ Y_UNIT_TEST_SUITE(KqpNewEngine) {
CompareYson(R"([[["nginx"];["nginx-23"];["PUT /form HTTP/1.1"];[2]]])", FormatResultSetYson(result.GetResultSet(0)));
stats = NYdb::TProtoAccessor::GetProto(*result.GetStats());
- UNIT_ASSERT_VALUES_EQUAL(2, stats.query_phases().size()); // with LiteralExecuter phase
- UNIT_ASSERT_VALUES_EQUAL(0, stats.query_phases()[0].table_access().size());
- UNIT_ASSERT_VALUES_EQUAL(1, stats.query_phases()[1].table_access().size());
- UNIT_ASSERT_VALUES_EQUAL(1, stats.query_phases()[1].affected_shards());
- UNIT_ASSERT_VALUES_EQUAL("/Root/Logs", stats.query_phases()[1].table_access()[0].name());
+ UNIT_ASSERT_VALUES_EQUAL(1, stats.query_phases().size()); // no LiteralExecuter phase
+ UNIT_ASSERT_VALUES_EQUAL(1, stats.query_phases()[0].table_access().size());
+ UNIT_ASSERT_VALUES_EQUAL(1, stats.query_phases()[0].affected_shards());
+ UNIT_ASSERT_VALUES_EQUAL("/Root/Logs", stats.query_phases()[0].table_access()[0].name());
}
}
diff --git a/ydb/core/kqp/ut/kqp_scan_ut.cpp b/ydb/core/kqp/ut/kqp_scan_ut.cpp
index 347ca354412..d0dae0edf6c 100644
--- a/ydb/core/kqp/ut/kqp_scan_ut.cpp
+++ b/ydb/core/kqp/ut/kqp_scan_ut.cpp
@@ -1083,42 +1083,68 @@ Y_UNIT_TEST_SUITE(KqpScan) {
}
#endif
- Y_UNIT_TEST(PrunePartitionsByLiteral) {
- TKikimrRunner kikimr(AppCfg());
+ Y_UNIT_TEST_TWIN(PrunePartitionsByLiteral, WithPredicatesExtract) {
+ auto cfg = AppCfg();
+ cfg.MutableFeatureFlags()->SetEnablePredicateExtractForScanQueries(WithPredicatesExtract);
+ TKikimrRunner kikimr(cfg);
NExperimental::TStreamQueryClient db(kikimr.GetDriver());
auto settings = NExperimental::TExecuteStreamQuerySettings()
.ProfileMode(NExperimental::EStreamQueryProfileMode::Basic);
- auto it = db.ExecuteStreamQuery(R"(
+ // simple key
+ {
+ auto it = db.ExecuteStreamQuery(Sprintf(R"(
+ PRAGMA Kikimr.OptEnablePredicateExtract = '%s';
SELECT * FROM `/Root/EightShard` WHERE Key = 301;
- )", settings).GetValueSync();
+ )", WithPredicatesExtract ? "true" : "false"), settings).GetValueSync();
- UNIT_ASSERT(it.IsSuccess());
+ UNIT_ASSERT(it.IsSuccess());
- TVector<TString> profiles;
- CompareYson(R"([[[3];[301u];["Value1"]]])", StreamResultToYson(it, &profiles));
+ TVector<TString> profiles;
+ CompareYson(R"([[[3];[301u];["Value1"]]])", StreamResultToYson(it, &profiles));
- UNIT_ASSERT_EQUAL(2, profiles.size());
+ UNIT_ASSERT_EQUAL(1, profiles.size());
- {
- NYql::NDqProto::TDqExecutionStats stats;
- google::protobuf::TextFormat::ParseFromString(profiles[0], &stats);
- UNIT_ASSERT(stats.IsInitialized());
+ {
+ NYql::NDqProto::TDqExecutionStats stats;
+ google::protobuf::TextFormat::ParseFromString(profiles[0], &stats);
+ UNIT_ASSERT(stats.IsInitialized());
- NKqpProto::TKqpExecutionExtraStats extraStats;
- UNIT_ASSERT(stats.GetExtra().UnpackTo(&extraStats));
- UNIT_ASSERT_VALUES_EQUAL(extraStats.GetAffectedShards(), 0);
+ NKqpProto::TKqpExecutionExtraStats extraStats;
+ UNIT_ASSERT(stats.GetExtra().UnpackTo(&extraStats));
+ UNIT_ASSERT_VALUES_EQUAL_C(extraStats.GetAffectedShards(), 1, "" << stats.DebugString());
+ }
}
+ // complex key
{
- NYql::NDqProto::TDqExecutionStats stats;
- google::protobuf::TextFormat::ParseFromString(profiles[1], &stats);
- UNIT_ASSERT(stats.IsInitialized());
+ auto params = TParamsBuilder()
+ .AddParam("$ts").Int64(2).Build()
+ .Build();
- NKqpProto::TKqpExecutionExtraStats extraStats;
- UNIT_ASSERT(stats.GetExtra().UnpackTo(&extraStats));
- UNIT_ASSERT_VALUES_EQUAL_C(extraStats.GetAffectedShards(), 1, "" << stats.DebugString());
+ auto it = db.ExecuteStreamQuery(Sprintf(R"(
+ PRAGMA Kikimr.OptEnablePredicateExtract = '%s';
+ DECLARE $ts AS Int64;
+ SELECT * FROM `/Root/Logs` WHERE App = "nginx" AND Ts > $ts
+ )", WithPredicatesExtract ? "true" : "false"), params, settings).GetValueSync();
+
+ UNIT_ASSERT(it.IsSuccess());
+
+ TVector<TString> profiles;
+ CompareYson(R"([[["nginx"];["nginx-23"];["GET /cat.jpg HTTP/1.1"];[3]]])", StreamResultToYson(it, &profiles));
+
+ UNIT_ASSERT_EQUAL(1, profiles.size());
+
+ {
+ NYql::NDqProto::TDqExecutionStats stats;
+ google::protobuf::TextFormat::ParseFromString(profiles[0], &stats);
+ UNIT_ASSERT(stats.IsInitialized());
+
+ NKqpProto::TKqpExecutionExtraStats extraStats;
+ UNIT_ASSERT(stats.GetExtra().UnpackTo(&extraStats));
+ UNIT_ASSERT_VALUES_EQUAL_C(extraStats.GetAffectedShards(), 1, "" << stats.DebugString());
+ }
}
}
diff --git a/ydb/core/kqp/ut/kqp_stats_ut.cpp b/ydb/core/kqp/ut/kqp_stats_ut.cpp
index 0f889f04477..28c57d9179c 100644
--- a/ydb/core/kqp/ut/kqp_stats_ut.cpp
+++ b/ydb/core/kqp/ut/kqp_stats_ut.cpp
@@ -31,7 +31,7 @@ Y_UNIT_TEST(MultiTxStatsFullExp) {
UNIT_ASSERT(res.PlanJson);
NJson::TJsonValue plan;
NJson::ReadJsonTree(*res.PlanJson, &plan, true);
- auto node = FindPlanNodeByKv(plan, "Node Type", "TopSort-TableRangesScan");
+ auto node = FindPlanNodeByKv(plan, "Node Type", "TopSort-TableRangeScan");
UNIT_ASSERT_EQUAL(node.GetMap().at("Stats").GetMapSafe().at("TotalTasks").GetIntegerSafe(), 2);
}
@@ -103,14 +103,14 @@ Y_UNIT_TEST(MultiTxStatsFull) {
);
UNIT_ASSERT(res.QueryStats);
- UNIT_ASSERT_VALUES_EQUAL(res.QueryStats->query_phases().size(), 2);
- UNIT_ASSERT_VALUES_EQUAL(res.QueryStats->query_phases(1).table_access(0).name(), "/Root/EightShard");
- UNIT_ASSERT_VALUES_EQUAL(res.QueryStats->query_phases(1).table_access(0).partitions_count(), 2);
+ UNIT_ASSERT_VALUES_EQUAL(res.QueryStats->query_phases().size(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(res.QueryStats->query_phases(0).table_access(0).name(), "/Root/EightShard");
+ UNIT_ASSERT_VALUES_EQUAL(res.QueryStats->query_phases(0).table_access(0).partitions_count(), 2);
UNIT_ASSERT(res.PlanJson);
NJson::TJsonValue plan;
NJson::ReadJsonTree(*res.PlanJson, &plan, true);
- auto node = FindPlanNodeByKv(plan, "Node Type", "TopSort-TableRangesScan");
+ auto node = FindPlanNodeByKv(plan, "Node Type", "TopSort-TableRangeScan");
UNIT_ASSERT_EQUAL(node.GetMap().at("Stats").GetMapSafe().at("TotalTasks").GetIntegerSafe(), 2);
}
diff --git a/ydb/core/kqp/ut/kqp_table_predicate_ut.cpp b/ydb/core/kqp/ut/kqp_table_predicate_ut.cpp
index c132bdb3fbb..328cb78e913 100644
--- a/ydb/core/kqp/ut/kqp_table_predicate_ut.cpp
+++ b/ydb/core/kqp/ut/kqp_table_predicate_ut.cpp
@@ -203,7 +203,7 @@ void ExecuteStreamQueryAndCheck(NExperimental::TStreamQueryClient& db, const TSt
NYql::NDqProto::TDqExecutionStats stats;
// First stage is computation, second scan read.
- google::protobuf::TextFormat::ParseFromString(profiles[1], &stats);
+ google::protobuf::TextFormat::ParseFromString(profiles.back(), &stats);
ui64 resultRows = stats.GetResultRows();
ui64 readRows = stats.GetTables(0).GetReadRows();
diff --git a/ydb/core/tx/datashard/datashard_ut_kqp_scan.cpp b/ydb/core/tx/datashard/datashard_ut_kqp_scan.cpp
index b2b14de1904..fbc1a745b7c 100644
--- a/ydb/core/tx/datashard/datashard_ut_kqp_scan.cpp
+++ b/ydb/core/tx/datashard/datashard_ut_kqp_scan.cpp
@@ -27,6 +27,7 @@ namespace {
}
void EnableLogging(TTestActorRuntime& runtime) {
+ // runtime.SetLogPriority(NKikimrServices::KQP_YQL, NLog::PRI_DEBUG);
runtime.SetLogPriority(NKikimrServices::TX_DATASHARD, NLog::PRI_DEBUG);
//runtime.SetLogPriority(NKikimrServices::TX_PROXY, NLog::PRI_DEBUG);
runtime.SetLogPriority(NKikimrServices::KQP_EXECUTER, NActors::NLog::PRI_TRACE);