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