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

Легковесное обновление

Легковесное обновление

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