Listing all parts in log have no sense. 
Should be either silenced, either combined into a single line.
}
            if (res.empty() || res.back().end - data_range.begin > min_marks_for_seek)
                res.push_back(data_range);
            else
                res.back().end = data_range.end;
        }
        last_index_mark = index_range.end - 1;
    }
    LOG_DEBUG(log, "Index {} has dropped {} / {} granules.", backQuote(index_helper->index.name), granules_dropped, total_granules);
    return res;
}
void MergeTreeDataSelectExecutor::selectPartsToRead(
    MergeTreeData::DataPartsVector & parts,
    const std::unordered_set<String> & part_values,
    const std::optional<KeyCondition> & minmax_idx_condition,
    std::optional<PartitionPruner> & partition_pruner,
    const PartitionIdToMaxBlock * max_block_numbers_to_read) const
{
    auto prev_parts = parts;
    parts.clear();
    for (const auto & part : prev_parts)
    {
        if (part_values.find(part->name) == part_values.end())
            continue;
        if (part->isEmpty())
            continue;
        if (minmax_idx_condition && !minmax_idx_condition->checkInHyperrectangle(
                part->minmax_idx.hyperrectangle, data.minmax_idx_column_types).can_be_true)
            continue;
        if (partition_pruner)