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