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

Обзор удаления данных

В ClickHouse существует несколько способов удаления данных, каждый из которых имеет свои преимущества и особенности производительности. Следует выбрать подходящий метод в зависимости от вашей модели данных и объёма данных, которые вы собираетесь удалить.

МетодСинтаксисКогда использовать
Лёгкое удалениеDELETE FROM [table]Используйте при удалении небольших объёмов данных. Строки немедленно исключаются из всех последующих запросов SELECT, но поначалу лишь помечаются как удалённые во внутреннем представлении и не удаляются с диска.
Мутация DELETEALTER TABLE [table] DELETEИспользуйте, когда данные необходимо немедленно удалить с диска (например, для соблюдения требований регуляторов). Негативно влияет на производительность запросов SELECT.
Очистка таблицыTRUNCATE TABLE [db.table]Эффективно удаляет все данные из таблицы.
Удаление разделаDROP PARTITIONЭффективно удаляет все данные из раздела.

Ниже приведён обзор различных способов удаления данных в ClickHouse:

Легковесные удаления

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

-- удалить все данные за 2018 год с помощью лёгкого удаления. Не рекомендуется.
DELETE FROM posts WHERE toYear(CreationDate) = 2018

Удаление больших объемов данных с помощью облегченного оператора DELETE также может негативно повлиять на производительность запросов SELECT. Эта команда также несовместима с таблицами с проекциями.

Обратите внимание, что при выполнении операции используется мутация для пометки удаленных строк (путем добавления столбца _row_exists), что приводит к дополнительным операциям ввода-вывода.

В целом облегченные удаления следует предпочитать мутациям, если можно допустить сохранение удаленных данных на диске (например, при отсутствии жестких требований по соответствию регуляторным нормам). Однако от этого подхода следует отказаться, если необходимо удалить все данные.

Подробнее об облегченных удалениях.

Мутации DELETE

Мутации DELETE можно выполнять с помощью команды ALTER TABLE ... DELETE, например:

-- удалить все данные за 2018 год с помощью мутации. Не рекомендуется.
ALTER TABLE posts DELETE WHERE toYear(CreationDate) = 2018

Они могут выполняться либо синхронно (по умолчанию для нереплицируемых таблиц), либо асинхронно (это определяется настройкой mutations_sync). Эти операции крайне ресурсоёмки по вводу-выводу, так как перезаписывают все части данных, которые удовлетворяют выражению WHERE. Этот процесс не является атомарным — части данных заменяются на модифицированные по мере их готовности, и SELECT-запрос, который начинает выполняться во время мутации, увидит данные как из уже изменённых частей, так и из тех, которые ещё не были изменены. Пользователи могут отслеживать состояние выполнения через таблицу system.mutations. Это операции с высокой нагрузкой на ввод-вывод; их следует использовать умеренно, так как они могут повлиять на производительность SELECT-запросов в кластере.

Подробнее о мутациях DELETE.

Очистка таблицы

Если необходимо удалить все данные в таблице, используйте команду TRUNCATE TABLE, показанную ниже. Это малозатратная операция.

TRUNCATE TABLE posts

Подробнее см. раздел TRUNCATE TABLE.

Удаление партиции

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

ALTER TABLE posts (DROP PARTITION '2008')

Подробнее см. раздел DROP PARTITION.

Дополнительные материалы