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

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

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

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