본문으로 바로가기
본문으로 바로가기

파티션 삭제하기

배경

파티셔닝은 테이블을 처음 정의할 때 PARTITION BY 절을 통해 지정합니다. 이 절에는任意の 컬럼에 대한 SQL 표현식을 포함할 수 있으며, 이 표현식의 결과에 따라 각 행이 어느 파티션으로 들어갈지가 결정됩니다.

데이터 파트는 디스크에서 각 파티션과 논리적으로 연결되며, 개별적으로 조회할 수 있습니다. 아래 예제에서는 toYear(CreationDate) 표현식을 사용해 posts 테이블을 연도별로 파티셔닝합니다. 행이 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)

파티션 표현 설정 방법은 파티션 표현을 설정하는 방법 섹션을 참고하십시오.

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 rows in set. Elapsed: 0.002 sec.

ALTER TABLE posts
(DROP PARTITION '2008')

0 rows in set. Elapsed: 0.103 sec.