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

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

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

Когда мгновенные мутации включены, обновлённые строки сразу же помечаются как изменённые, и последующие запросы 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;

-- Disable background materialization of mutations to showcase
-- default behavior when on-the-fly mutations are not enabled
SYSTEM STOP MERGES test_on_fly_mutations;
SET mutations_sync = 0;

-- Insert some rows in our new table
INSERT INTO test_on_fly_mutations VALUES (1, 'a'), (2, 'b'), (3, 'c');

-- Update the values of the rows
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:

-- Explicitly disable on-the-fly-mutations
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 │
└────┴───┘

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

-- Enable on-the-fly mutations
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).