Когда мутации на лету включены, обновленные строки сразу помечаются как измененные, и последующие запросы SELECT автоматически возвращают измененные значения. Когда мутации на лету отключены, чтобы увидеть измененные значения, может потребоваться дождаться, пока мутации будут применены в фоновом режиме.
Мутации на лету можно включить для таблиц семейства MergeTree, активировав настройку уровня запроса apply_mutations_on_fly.
Давайте создадим таблицу и выполним несколько мутаций:
Давайте проверим результат обновлений с помощью запроса SELECT:
Обратите внимание, что значения в строках ещё не обновились, когда мы выполняем запрос к новой таблице:
Теперь посмотрим, что происходит при включении мутаций «на лету»:
Теперь запрос SELECT сразу возвращает правильный результат, без необходимости ждать применения мутаций:
Когда включены мутации на лету, мутации не материализуются сразу, а применяются только при выполнении SELECT-запросов. Однако обратите внимание: мутации по-прежнему материализуются асинхронно в фоновом режиме, и это ресурсоемкий процесс.
Если число отправленных мутаций в течение некоторого интервала времени постоянно превышает число мутаций, обрабатываемых в фоновом режиме, очередь нематериализованных мутаций, которые нужно применить, будет продолжать расти. Это со временем приведет к снижению производительности SELECT-запросов.
Мы рекомендуем включать настройку apply_mutations_on_fly вместе с другими настройками уровня MergeTree, такими как number_of_mutations_to_throw и number_of_mutations_to_delay, чтобы предотвратить бесконтрольный рост числа нематериализованных мутаций.
Поддержка подзапросов и недетерминированных функций
Мутации на лету ограниченно поддерживают подзапросы и недетерминированные функции. Поддерживаются только скалярные подзапросы с результатом разумного размера (контролируется настройкой mutations_max_literal_size_to_replace). Поддерживаются только константные недетерминированные функции (например, функция now()).
Это поведение регулируется следующими настройками:
mutations_execute_nondeterministic_on_initiator - если true, недетерминированные функции выполняются на реплике-инициаторе и подставляются как литералы в запросы UPDATE и DELETE. Значение по умолчанию: false.
mutations_execute_subqueries_on_initiator - если true, скалярные подзапросы выполняются на реплике-инициаторе и подставляются как литералы в запросы UPDATE и DELETE. Значение по умолчанию: false.
mutations_max_literal_size_to_replace - максимальный размер сериализованных литералов в байтах, подставляемых в запросы UPDATE и DELETE. Значение по умолчанию: 16384 (16 KiB).
Последнее изменение 10 июня 2026 г.