Обзор удаления
Существует несколько способов удаления данных в 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). Эти операции чрезвычайно ресурсоемки, перерабатывая все части, которые соответствуют выражению WHERE
. В этом процессе отсутствует атомарность - части заменяются на измененные части, как только они готовы, и запрос SELECT
, который начинает выполняться во время мутации, увидит данные из частей, которые уже были изменены, наряду с данными из частей, которые еще не были изменены. Пользователи могут отслеживать состояние прогресса через таблицу systems.mutations. Эти операции требуют интенсивных I/O и должны использоваться экономно, так как они могут повлиять на производительность SELECT
кластера.
Подробнее о удалениях с помощью мутаций.
Очистка таблицы
Если необходимо удалить все данные в таблице, используйте команду TRUNCATE TABLE
, показанную ниже. Это легковесная операция.
Подробнее о TRUNCATE TABLE.
Удаление партиции
Если вы указали пользовательский ключ партиционирования для ваших данных, партиции могут быть эффективно удалены. Избегайте партиционирования с высокой кардинальностью.
Подробнее о DROP PARTITION.