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