Обзор удаления
Существует несколько способов удаления данных в 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.