파티션 삭제
파티션 삭제 (Dropping partitions)
ALTER TABLE ... DROP PARTITION은 파티션 전체를 비용 효율적으로 삭제하는 방법입니다. 파티셔닝은 테이블을 정의할 때 PARTITION BY 절로 지정하며, 데이터 파트는 디스크에서 파티션과 논리적으로 연관되어 독립적으로 조작할 수 있습니다.
출처: 문서
본문
배경 (Background)
파티셔닝은 테이블이 처음 정의될 때 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)
파티션 표현식 설정은 "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년의 posts를 관련 파티션을 삭제해 제거합니다.
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.