diff --git a/ydb/core/tx/columnshard/engines/reader/plain_reader/iterator/scanner.cpp b/ydb/core/tx/columnshard/engines/reader/plain_reader/iterator/scanner.cpp index fdde4ac0c645..9eafaf6f7cf1 100644 --- a/ydb/core/tx/columnshard/engines/reader/plain_reader/iterator/scanner.cpp +++ b/ydb/core/tx/columnshard/engines/reader/plain_reader/iterator/scanner.cpp @@ -9,7 +9,7 @@ void TScanHead::OnIntervalResult(const std::optional&& merger, const ui32 intervalIdx, TPlainReadData& reader) { if (Context->GetReadMetadata()->Limit && (!newBatch || newBatch->GetRecordsCount() == 0) && InFlightLimit < 1000) { if (++ZeroCount == std::max(16, InFlightLimit)) { - InFlightLimit *= 2; + InFlightLimit = std::max(MaxInFlight, InFlightLimit * 2); ZeroCount = 0; } } else { @@ -97,7 +97,17 @@ TConclusionStatus TScanHead::Start() { TScanHead::TScanHead(std::deque>&& sources, const std::shared_ptr& context) : Context(context) { - InFlightLimit = Context->GetReadMetadata()->Limit ? 1 : Max(); + if (!HasAppData() || !AppDataVerified().ColumnShardConfig.HasMaxInFlightIntervalsOnRequest()) { + MaxInFlight = 256; + } else { + MaxInFlight = AppDataVerified().ColumnShardConfig.GetMaxInFlightIntervalsOnRequest(); + } + + if (Context->GetReadMetadata()->Limit) { + InFlightLimit = 1; + } else { + InFlightLimit = MaxInFlight; + } while (sources.size()) { auto source = sources.front(); BorderPoints[source->GetStart()].AddStart(source); diff --git a/ydb/core/tx/columnshard/engines/reader/plain_reader/iterator/scanner.h b/ydb/core/tx/columnshard/engines/reader/plain_reader/iterator/scanner.h index 75de439aec63..7092dac19acd 100644 --- a/ydb/core/tx/columnshard/engines/reader/plain_reader/iterator/scanner.h +++ b/ydb/core/tx/columnshard/engines/reader/plain_reader/iterator/scanner.h @@ -78,6 +78,7 @@ class TScanHead { ui32 SegmentIdxCounter = 0; std::vector IntervalStats; ui64 InFlightLimit = 1; + ui64 MaxInFlight = 256; ui64 ZeroCount = 0; bool AbortFlag = false; void DrainSources();