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

> Легковесные обновления упрощают процесс обновления данных в базе данных с помощью патч-частей.

# Оператор легковесного UPDATE

export const galaxyOnClick = eventName => () => {
  try {
    if (typeof window !== "undefined" && window.galaxy && eventName) {
      window.galaxy.track(eventName, {
        interaction: "click"
      });
    }
  } catch (e) {}
};

export const BetaBadge = ({link, galaxyTrack, galaxyEvent}) => {
  if (link) {
    return <a href={link} target="_blank" rel="noopener noreferrer" className="betaBadge" onClick={galaxyTrack && galaxyEvent ? galaxyOnClick(galaxyEvent) : undefined}>
                <Icon />
                <span>Beta</span>
            </a>;
  }
  return <div className="betaBadge">
            <Icon />
            <span>
                Beta feature. 
                <u>
                    <a href="/docs/beta-and-experimental-features#beta-features">
                        Learn more.
                    </a>
                </u>
            </span>
        </div>;
};

<Note>
  Легковесные обновления сейчас в бете.
  Если у вас возникнут проблемы, пожалуйста, создайте issue в [репозитории ClickHouse](https://github.com/clickhouse/clickhouse/issues).
</Note>

Оператор легковесного `UPDATE` обновляет строки в таблице `[db.]table`, которые соответствуют выражению `filter_expr`.
Он называется "легковесным обновлением" в отличие от запроса [`ALTER TABLE ... UPDATE`](/ru/reference/statements/alter/update), который представляет собой ресурсоёмкий процесс и переписывает целые столбцы в частях данных.
Он доступен только для семейства движков таблиц [`MergeTree`](/ru/reference/engines/table-engines/mergetree-family/mergetree).

```sql theme={null}
UPDATE [db.]table [ON CLUSTER cluster] SET column1 = expr1 [, ...] [IN PARTITION partition_expr] WHERE filter_expr;
```

`filter_expr` должен иметь тип `UInt8`. Этот запрос обновляет значения указанных столбцов значениями соответствующих выражений в тех строках, где `filter_expr` принимает ненулевое значение.
Значения приводятся к типу столбца с помощью оператора `CAST`. Обновление столбцов, используемых при вычислении основного ключа или ключа партиционирования, не поддерживается.

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

```sql theme={null}
UPDATE hits SET Title = 'Updated Title' WHERE EventDate = today();

UPDATE wikistat SET hits = hits + 1, time = now() WHERE path = 'ClickHouse';
```

<div id="lightweight-update-does-not-update-data-immediately">
  ## Легковесные обновления не обновляют данные сразу
</div>

Легковесный `UPDATE` реализован с помощью **патч-частей** — особого вида частей данных, которые содержат только обновлённые столбцы и строки.
Легковесный `UPDATE` создаёт патч-части, но не вносит немедленных физических изменений в исходные данные в хранилище.
Процесс обновления похож на запрос `INSERT ... SELECT ...`, но запрос `UPDATE` ждёт завершения создания патч-части, прежде чем завершиться.

Обновлённые значения:

* **Сразу видны** в запросах `SELECT` за счёт применения патчей
* **Физически материализуются** только во время последующих слияний и мутаций
* **Автоматически удаляются** после того, как патчи будут материализованы во всех активных частях

<div id="lightweight-update-requirements">
  ## Требования к легковесным обновлениям
</div>

Легковесные обновления поддерживаются для движков [`MergeTree`](/ru/reference/engines/table-engines/mergetree-family/mergetree), [`ReplacingMergeTree`](/ru/reference/engines/table-engines/mergetree-family/replacingmergetree), [`CollapsingMergeTree`](/ru/reference/engines/table-engines/mergetree-family/collapsingmergetree), [`VersionedCollapsingMergeTree`](/ru/reference/engines/table-engines/mergetree-family/versionedcollapsingmergetree), а также их версий [`Replicated`](/ru/reference/engines/table-engines/mergetree-family/replication) и [`Shared`](/ru/products/cloud/features/infrastructure/shared-merge-tree).

Чтобы использовать легковесные обновления, нужно включить материализацию столбцов `_block_number` и `_block_offset` с помощью настроек таблицы [`enable_block_number_column`](/ru/reference/settings/merge-tree-settings#enable_block_number_column) и [`enable_block_offset_column`](/ru/reference/settings/merge-tree-settings#enable_block_offset_column).

<div id="lightweight-delete">
  ## Легковесные удаления
</div>

Запрос [легковесного `DELETE`](/ru/reference/statements/delete) можно выполнить как легковесный `UPDATE`, а не как мутацию `ALTER UPDATE`. Реализация легковесного `DELETE` управляется настройкой [`lightweight_delete_mode`](/ru/reference/settings/session-settings#lightweight_delete_mode).

<div id="performance-considerations">
  ## Особенности производительности
</div>

**Преимущества легковесных обновлений:**

* Задержка обновления сопоставима с задержкой запроса `INSERT ... SELECT ...`
* Записываются только обновлённые столбцы и значения, а не столбцы целиком в частях данных
* Не нужно ждать завершения уже выполняющихся слияний/мутаций, поэтому задержка обновления предсказуема
* Возможно параллельное выполнение легковесных обновлений

**Возможное влияние на производительность:**

* Добавляют накладные расходы для запросов `SELECT`, в которых нужно применять патчи
* [Индексы пропуска данных](/ru/reference/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-data_skipping-indexes) не будут использоваться для столбцов в частях данных, к которым нужно применить патчи. [Проекции](/ru/reference/engines/table-engines/mergetree-family/mergetree#projections) не будут использоваться, если у таблицы есть патч-части, в том числе для частей данных, к которым патчи применять не нужно.
* Небольшие, но слишком частые обновления могут привести к ошибке "слишком много частей". Рекомендуется объединять несколько обновлений в один запрос, например поместив идентификаторы обновляемых строк в одно условие `IN` в `WHERE`
* Легковесные обновления рассчитаны на обновление небольшого количества строк (примерно до 10% таблицы). Если нужно обновить больший объём данных, рекомендуется использовать мутацию [`ALTER TABLE ... UPDATE`](/ru/reference/statements/alter/update)

<div id="concurrent-operations">
  ## Параллельные операции
</div>

Легковесные обновления, в отличие от тяжёлых мутаций, не ждут завершения текущих слияний/мутаций.
Согласованность параллельных легковесных обновлений определяется настройками [`update_sequential_consistency`](/ru/reference/settings/session-settings#update_sequential_consistency) и [`update_parallel_mode`](/ru/reference/settings/session-settings#update_parallel_mode).

<div id="update-permissions">
  ## Разрешения для UPDATE
</div>

Для `UPDATE` требуется привилегия `ALTER UPDATE`. Чтобы разрешить команды `UPDATE` для конкретной таблицы указанному пользователю, выполните:

```sql theme={null}
GRANT ALTER UPDATE ON db.table TO username;
```

<div id="details-of-the-implementation">
  ## Детали реализации
</div>

Патч-части — это обычные части, но они содержат только обновлённые столбцы и несколько системных столбцов:

* `_part` - имя исходной части
* `_part_offset` - номер строки в исходной части
* `_block_number` - номер блока строки в исходной части
* `_block_offset` - смещение строки в блоке исходной части
* `_data_version` - версия обновлённых данных (номер блока, выделенный для запроса `UPDATE`)

В среднем это даёт около 40 байт накладных расходов (несжатых данных) на каждую обновлённую строку в патч-частях.
Системные столбцы помогают находить строки в исходной части, которые нужно обновить.
Системные столбцы связаны с [виртуальными столбцами](/ru/reference/engines/table-engines/mergetree-family/mergetree#virtual-columns) в исходной части, которые добавляются при чтении, если требуется применить патч-части.
Патч-части сортируются по `_part` и `_part_offset`.

Патч-части принадлежат другим партициям, чем исходная часть.
Идентификатор партиции патч-части имеет вид `patch-<hash of column names in patch part>-<original_partition_id>`.
Поэтому патч-части с разными столбцами хранятся в разных партициях.
Например, три обновления `SET x = 1 WHERE <cond>`, `SET y = 1 WHERE <cond>` и `SET x = 1, y = 1 WHERE <cond>` создадут три патч-части в трёх разных партициях.

Патч-части могут сливаться между собой, чтобы уменьшить число применяемых патчей в запросах `SELECT` и снизить накладные расходы. Для слияния патч-частей используется алгоритм слияния [replacing](/ru/reference/engines/table-engines/mergetree-family/replacingmergetree) с `_data_version` в качестве version column.
Поэтому патч-части всегда хранят последнюю версию для каждой обновлённой строки в части.

Легковесные обновления не ждут завершения текущих слияний и мутаций и всегда используют текущий снимок частей данных, чтобы выполнить обновление и создать патч-часть.
Из-за этого возможны два случая применения патч-частей.

Например, если мы читаем часть `A`, нужно применить патч-часть `X`:

* если `X` содержит саму часть `A`. Это происходит, если `A` не участвовала в слиянии на момент выполнения `UPDATE`.
* если `X` содержит части `B` и `C`, которые покрываются частью `A`. Это происходит, если на момент выполнения `UPDATE` выполнялось слияние (`B`, `C`) -> `A`.

Для этих двух случаев есть два соответствующих способа применения патч-частей:

* Использование слияния по отсортированным столбцам `_part`, `_part_offset`.
* Использование JOIN по столбцам `_block_number`, `_block_offset`.

Режим JOIN медленнее и требует больше памяти, чем режим слияния, но используется реже.

<div id="related-content">
  ## Связанные материалы
</div>

* [`ALTER UPDATE`](/ru/reference/statements/alter/update) — тяжёлые операции `UPDATE`
* [Легковесный `DELETE`](/ru/reference/statements/delete) — операции легковесного `DELETE`
* [`APPLY PATCHES`](/ru/reference/statements/alter/apply-patches) — принудительная физическая материализация патчей в частях данных (операция мутации)
