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