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

Удаление разделов

Общие сведения

Партиционирование задаётся для таблицы при её первоначальном определении с помощью предложения PARTITION BY. В этом предложении может использоваться SQL-выражение над любыми столбцами, результат которого определяет, в какой раздел (партицию) будет помещена строка.

Части данных на диске логически связаны с каждым разделом и могут запрашиваться изолированно. В примере ниже мы партиционируем таблицу posts по годам, используя выражение toYear(CreationDate). По мере вставки строк в ClickHouse это выражение будет вычисляться для каждой строки и строка будет направляться в соответствующий раздел, если он уже существует (если это первая строка для данного года, раздел будет создан).

 CREATE TABLE posts
(
        `Id` Int32 CODEC(Delta(4), ZSTD(1)),
        `PostTypeId` Enum8('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8),
        `AcceptedAnswerId` UInt32,
        `CreationDate` DateTime64(3, 'UTC'),
...
        `ClosedDate` DateTime64(3, 'UTC')
)
ENGINE = MergeTree
ORDER BY (PostTypeId, toDate(CreationDate), CreationDate)
PARTITION BY toYear(CreationDate)

Прочитайте о настройке выражения партиционирования в разделе How to set the partition expression.

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

Удаление разделов

ALTER TABLE ... DROP PARTITION предоставляет ресурсно-эффективный способ удаления целого раздела.

ALTER TABLE table_name [ON CLUSTER cluster] DROP PARTITION|PART partition_expr

Этот запрос помечает раздел как неактивный и полностью удаляет данные примерно через 10 минут. Запрос реплицируется — он удаляет данные на всех репликах.

В примере ниже мы удаляем записи за 2008 год для ранее рассмотренной таблицы, путём удаления соответствующего раздела.

SELECT DISTINCT partition
FROM system.parts
WHERE `table` = 'posts'

┌─partition─┐
│ 2008      │
│ 2009      │
│ 2010      │
│ 2011      │
│ 2012      │
│ 2013      │
│ 2014      │
│ 2015      │
│ 2016      │
│ 2017      │
│ 2018      │
│ 2019      │
│ 2020      │
│ 2021      │
│ 2022      │
│ 2023      │
│ 2024      │
└───────────┘

17 строк в результате. Прошло: 0.002 сек.

ALTER TABLE posts
(DROP PARTITION '2008')

0 строк в результате. Прошло: 0.103 сек.