Обзор удаления данных
В ClickHouse существует несколько способов удаления данных, каждый из которых имеет свои преимущества и особенности производительности. Следует выбрать подходящий метод в зависимости от вашей модели данных и объёма данных, которые вы собираетесь удалить.
| Метод | Синтаксис | Когда использовать |
|---|---|---|
| Лёгкое удаление | DELETE FROM [table] | Используйте при удалении небольших объёмов данных. Строки немедленно исключаются из всех последующих запросов SELECT, но поначалу лишь помечаются как удалённые во внутреннем представлении и не удаляются с диска. |
| Мутация DELETE | ALTER TABLE [table] DELETE | Используйте, когда данные необходимо немедленно удалить с диска (например, для соблюдения требований регуляторов). Негативно влияет на производительность запросов SELECT. |
| Очистка таблицы | TRUNCATE TABLE [db.table] | Эффективно удаляет все данные из таблицы. |
| Удаление раздела | DROP PARTITION | Эффективно удаляет все данные из раздела. |
Ниже приведён обзор различных способов удаления данных в ClickHouse:
Легковесные удаления
Легковесные удаления приводят к тому, что строки немедленно помечаются как удалённые и автоматически исключаются из всех последующих запросов SELECT. Фактическое удаление этих помеченных строк происходит во время обычных циклов слияния и, таким образом, требует меньше операций ввода-вывода. В результате в течение неопределённого периода данные могут фактически не удаляться из хранилища, а лишь быть помеченными как удалённые. Если вам необходимо гарантировать, что данные действительно удалены, рассмотрите возможность использования приведённой выше команды мутации.
Удаление больших объемов данных с помощью облегченного оператора DELETE также может негативно повлиять на производительность запросов SELECT. Эта команда также несовместима с таблицами с проекциями.
Обратите внимание, что при выполнении операции используется мутация для пометки удаленных строк (путем добавления столбца _row_exists), что приводит к дополнительным операциям ввода-вывода.
В целом облегченные удаления следует предпочитать мутациям, если можно допустить сохранение удаленных данных на диске (например, при отсутствии жестких требований по соответствию регуляторным нормам). Однако от этого подхода следует отказаться, если необходимо удалить все данные.
Подробнее об облегченных удалениях.
Мутации DELETE
Мутации DELETE можно выполнять с помощью команды ALTER TABLE ... DELETE, например:
Они могут выполняться либо синхронно (по умолчанию для нереплицируемых таблиц), либо асинхронно (это определяется настройкой mutations_sync). Эти операции крайне ресурсоёмки по вводу-выводу, так как перезаписывают все части данных, которые удовлетворяют выражению WHERE. Этот процесс не является атомарным — части данных заменяются на модифицированные по мере их готовности, и SELECT-запрос, который начинает выполняться во время мутации, увидит данные как из уже изменённых частей, так и из тех, которые ещё не были изменены. Пользователи могут отслеживать состояние выполнения через таблицу system.mutations. Это операции с высокой нагрузкой на ввод-вывод; их следует использовать умеренно, так как они могут повлиять на производительность SELECT-запросов в кластере.
Подробнее о мутациях DELETE.
Очистка таблицы
Если необходимо удалить все данные в таблице, используйте команду TRUNCATE TABLE, показанную ниже. Это малозатратная операция.
Подробнее см. раздел TRUNCATE TABLE.
Удаление партиции
Если для ваших данных задан пользовательский ключ партиционирования, партиции можно эффективно удалять. Избегайте партиционирования с высокой кардинальностью.
Подробнее см. раздел DROP PARTITION.