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