Перейти к основному содержанию
Перейти к основному содержанию

Мутации на лету

Мгновенные мутации

Когда мгновенные мутации включены, обновлённые строки сразу же помечаются как изменённые, и последующие запросы SELECT автоматически возвращают новые значения. Если мгновенные мутации отключены, может потребоваться подождать, пока мутации будут применены фоновым процессом, чтобы увидеть изменённые значения.

Мгновенные мутации можно включить для таблиц семейства MergeTree, установив параметр уровня запроса apply_mutations_on_fly.

SET apply_mutations_on_fly = 1;

Пример

Давайте создадим таблицу и выполним несколько мутаций:

CREATE TABLE test_on_fly_mutations (id UInt64, v String)
ENGINE = MergeTree ORDER BY id;

-- Отключаем фоновую материализацию мутаций для демонстрации
-- поведения по умолчанию при отключённых мутациях на лету
SYSTEM STOP MERGES test_on_fly_mutations;
SET mutations_sync = 0;

-- Вставляем несколько строк в новую таблицу
INSERT INTO test_on_fly_mutations VALUES (1, 'a'), (2, 'b'), (3, 'c');

-- Обновляем значения строк
ALTER TABLE test_on_fly_mutations UPDATE v = 'd' WHERE id = 1;
ALTER TABLE test_on_fly_mutations DELETE WHERE v = 'd';
ALTER TABLE test_on_fly_mutations UPDATE v = 'e' WHERE id = 2;
ALTER TABLE test_on_fly_mutations DELETE WHERE v = 'e';

Проверим результат внесённых изменений с помощью запроса SELECT:

-- Явно отключаем мутации на лету
SET apply_mutations_on_fly = 0;

SELECT id, v FROM test_on_fly_mutations ORDER BY id;

Обратите внимание, что на момент выполнения запроса к новой таблице значения строк еще не были обновлены:

┌─id─┬─v─┐
│  1 │ a │
│  2 │ b │
│  3 │ c │
└────┴───┘

Теперь посмотрим, что произойдёт, когда мы включим мутации на лету:

-- Включить мутации на лету
SET apply_mutations_on_fly = 1;

SELECT id, v FROM test_on_fly_mutations ORDER BY id;

Запрос SELECT теперь сразу возвращает корректный результат, не дожидаясь применения мутаций:

┌─id─┬─v─┐
│  3 │ c │
└────┴───┘

Влияние на производительность

Когда включены мутации «на лету», мутации не материализуются немедленно, а применяются только во время запросов 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).