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

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

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

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

Вот краткий обзор различных способов удаления данных в ClickHouse:

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

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

-- delete all data from 2018 with a lightweight delete. Not recommended.
DELETE FROM posts WHERE toYear(CreationDate) = 2018

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

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

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

Узнайте больше о легковесных удалениях.

Удаления мутаций

Удаления мутаций могут быть выполнены через команду ALTER TABLE ... DELETE, например

-- delete all data from 2018 with a mutation. Not recommended.
ALTER TABLE posts DELETE WHERE toYear(CreationDate) = 2018

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

Узнайте больше о удалениях мутаций.

Ограничение таблицы

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

TRUNCATE TABLE posts

Узнайте больше о TRUNCATE TABLE.

Удалить партицию

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

ALTER TABLE posts (DROP PARTITION '2008')

Узнайте больше о DROP PARTITION.

Дополнительные ресурсы