Listing all parts in log have no sense. 
Should be either silenced, either combined into a single line.
input_order_info->direction, 1);
        for (auto & plan : plans)
        {
            
            out_projection = createProjection(plan->getCurrentDataStream().header);
            auto expression_step = std::make_unique<ExpressionStep>(
                    plan->getCurrentDataStream(),
                    sorting_key_prefix_expr);
            expression_step->setStepDescription("Calculate sorting key prefix");
            plan->addStep(std::move(expression_step));
            auto merging_sorted = std::make_unique<MergingSortedStep>(
                    plan->getCurrentDataStream(),
                    sort_description,
                    max_block_size);
            merging_sorted->setStepDescription("Merge sorting mark ranges");
            plan->addStep(std::move(merging_sorted));
        }
    }
    if (plans.size() == 1)
        return std::move(plans.front());
    DataStreams input_streams;
    for (const auto & plan : plans)
        input_streams.emplace_back(plan->getCurrentDataStream());
    const auto & common_header = plans.front()->getCurrentDataStream().header;
    auto union_step = std::make_unique<UnionStep>(std::move(input_streams), common_header);
    auto plan = std::make_unique<QueryPlan>();
    plan->unitePlans(std::move(union_step), std::move(plans));
    return plan;
}
QueryPlanPtr MergeTreeDataSelectExecutor::spreadMarkRangesAmongStreamsFinal(