Listing all parts in log have no sense. 
Should be either silenced, either combined into a single line.
metadata_snapshot,
            query_info.prewhere_info,
            true,
            column_names,
            MergeTreeReadPool::BackoffSettings(settings),
            settings.preferred_block_size_bytes,
            false);
        
        LOG_TRACE(log, "Reading approx. {} rows with {} streams", total_rows, num_streams);
        for (size_t i = 0; i < num_streams; ++i)
        {
            auto source = std::make_shared<MergeTreeThreadSelectBlockInputProcessor>(
                i, pool, min_marks_for_concurrent_read, max_block_size,
                settings.preferred_block_size_bytes, settings.preferred_max_column_in_block_size_bytes,
                data, metadata_snapshot, use_uncompressed_cache,
                query_info.prewhere_info, reader_settings, virt_columns);
            if (i == 0)
            {
                
                source->addTotalRowsApprox(total_rows);
            }
            res.emplace_back(std::move(source));
        }
        return createPlanFromPipe(Pipe::unitePipes(std::move(res)), query_id, data);
    }
    else
    {
        
        Pipes res;
        for (const auto & part : parts)