If they are defined, they can override table-level settings.
}
        size_t min_occupation_size = std::numeric_limits<size_t>::max();
        std::vector<String> candidates;
        for (const auto & [disk_name, size] : disk_occupation)
        {
            if (size < min_occupation_size)
            {
                min_occupation_size = size;
                candidates = {disk_name};
            }
            else if (size == min_occupation_size)
            {
                candidates.push_back(disk_name);
            }
        }
        if (!candidates.empty())
        {
            /
            std::shuffle(candidates.begin(), candidates.end(), thread_local_rng);
            String selected_disk_name = candidates.front();
            WriteBufferFromOwnString log_str;
            writeCString("\nbalancer: \n", log_str);
            for (const auto & [disk_name, per_disk_parts] : disk_parts_for_logging)
                writeString(fmt::format("  {}: [{}]\n", disk_name, fmt::join(per_disk_parts, ", ")), log_str);
            LOG_DEBUG(log, fmt::runtime(log_str.str()));
            if (ttl_infos)
                reserved_space = tryReserveSpacePreferringTTLRules(
                    metadata_snapshot,
                    part_size,
                    *ttl_infos,