> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-postgresql-tls-support.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

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

> Описание мутаций на лету

<div id="on-the-fly-mutations">
  ## Мутации на лету
</div>

Когда мутации на лету включены, обновленные строки сразу помечаются как измененные, и последующие запросы `SELECT` автоматически возвращают измененные значения. Когда мутации на лету отключены, чтобы увидеть измененные значения, может потребоваться дождаться, пока мутации будут применены в фоновом режиме.

Мутации на лету можно включить для таблиц семейства `MergeTree`, активировав настройку уровня запроса `apply_mutations_on_fly`.

```sql theme={null}
SET apply_mutations_on_fly = 1;
```

<div id="example">
  ## Пример
</div>

Давайте создадим таблицу и выполним несколько мутаций:

```sql theme={null}
CREATE TABLE test_on_fly_mutations (id UInt64, v String)
ENGINE = MergeTree ORDER BY id;

-- Отключить фоновую материализацию мутаций для демонстрации
-- поведения по умолчанию, когда мутации на лету не включены
SYSTEM STOP MERGES test_on_fly_mutations;
SET mutations_sync = 0;

-- Вставить несколько строк в новую таблицу
INSERT INTO test_on_fly_mutations VALUES (1, 'a'), (2, 'b'), (3, 'c');

-- Обновить значения строк
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`:

```sql theme={null}
-- Явно отключаем мутации на лету
SET apply_mutations_on_fly = 0;

SELECT id, v FROM test_on_fly_mutations ORDER BY id;
```

Обратите внимание, что значения в строках ещё не обновились, когда мы выполняем запрос к новой таблице:

```response theme={null}
┌─id─┬─v─┐
│  1 │ a │
│  2 │ b │
│  3 │ c │
└────┴───┘
```

Теперь посмотрим, что происходит при включении мутаций «на лету»:

```sql theme={null}
-- Включить мутации на лету
SET apply_mutations_on_fly = 1;

SELECT id, v FROM test_on_fly_mutations ORDER BY id;
```

Теперь запрос `SELECT` сразу возвращает правильный результат, без необходимости ждать применения мутаций:

```response theme={null}
┌─id─┬─v─┐
│  3 │ c │
└────┴───┘
```

<div id="performance-impact">
  ## Влияние на производительность
</div>

Когда включены мутации на лету, мутации не материализуются сразу, а применяются только при выполнении `SELECT`-запросов. Однако обратите внимание: мутации по-прежнему материализуются асинхронно в фоновом режиме, и это ресурсоемкий процесс.

Если число отправленных мутаций в течение некоторого интервала времени постоянно превышает число мутаций, обрабатываемых в фоновом режиме, очередь нематериализованных мутаций, которые нужно применить, будет продолжать расти. Это со временем приведет к снижению производительности `SELECT`-запросов.

Мы рекомендуем включать настройку `apply_mutations_on_fly` вместе с другими настройками уровня `MergeTree`, такими как `number_of_mutations_to_throw` и `number_of_mutations_to_delay`, чтобы предотвратить бесконтрольный рост числа нематериализованных мутаций.

<div id="support-for-subqueries-and-non-deterministic-functions">
  ## Поддержка подзапросов и недетерминированных функций
</div>

Мутации на лету ограниченно поддерживают подзапросы и недетерминированные функции. Поддерживаются только скалярные подзапросы с результатом разумного размера (контролируется настройкой `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).
