삭제 개요
삭제 개요 (Delete overview)
ClickHouse에서 데이터를 삭제하는 방법은 여러 가지이며, 각각 장점과 성능 특성이 다릅니다. 데이터 모델과 삭제하려는 데이터 양에 따라 적절한 방법을 선택해야 합니다.
출처: 문서
본문
ClickHouse에서 데이터를 삭제하는 방법은 여러 가지가 있으며, 각각 장점과 성능 특성이 있습니다. 데이터 모델과 삭제하려는 데이터 양에 따라 적절한 방법을 선택해야 합니다.
| 방법 | 문법 | 언제 사용 |
|---|---|---|
| 경량 삭제 (Lightweight delete) | DELETE FROM [table] | 적은 양의 데이터를 삭제할 때. 행이 이후 모든 SELECT 쿼리에서 즉시 필터링되지만, 처음에는 내부적으로 삭제로 표시될 뿐 디스크에서 제거되지는 않습니다. |
| 삭제 뮤테이션 (Delete mutation) | ALTER TABLE [table] DELETE | 데이터를 디스크에서 즉시 삭제해야 할 때(예: 규정 준수). SELECT 성능에 부정적 영향을 줍니다. |
| 테이블 비우기 (Truncate table) | TRUNCATE TABLE [db.table] | 테이블의 모든 데이터를 효율적으로 제거합니다. |
| 파티션 삭제 (Drop partition) | DROP PARTITION | 파티션의 모든 데이터를 효율적으로 제거합니다. |
다음은 ClickHouse에서 데이터를 삭제하는 여러 방법의 요약입니다.
경량 삭제 (Lightweight deletes)
경량 삭제는 행을 즉시 삭제로 표시해 이후 모든 SELECT 쿼리에서 자동으로 필터링되게 합니다. 이 삭제된 행의 실제 제거는 자연 병합 주기 동안 발생하므로 I/O가 덜 듭니다. 그 결과, 특정하지 않은 기간 동안 데이터가 스토리지에서 실제로 삭제되지 않고 삭제로 표시만 될 수 있습니다. 데이터가 삭제됨을 보장해야 한다면 위의 뮤테이션 명령을 고려하세요.
-- delete all data from 2018 with a lightweight delete. Not recommended.
DELETE FROM posts WHERE toYear(CreationDate) = 2018
경량 DELETE 문으로 대량의 데이터를 삭제하는 것도 SELECT 쿼리 성능에 부정적 영향을 줄 수 있습니다. 이 명령은 프로젝션이 있는 테이블과도 호환되지 않습니다.
이 연산에는 삭제된 행을 표시(_row_exists 컬럼 추가)하는 뮤테이션이 사용되어 일부 I/O가 발생함을 주의하세요.
일반적으로, 디스크에 삭제된 데이터가 존재하는 것을 용인할 수 있다면(예: 규정 준수가 아닌 경우) 뮤테이션보다 경량 삭제를 선호해야 합니다. 이 접근 방식은 모든 데이터를 삭제해야 할 때는 여전히 피해야 합니다.
경량 삭제에 대해 더 읽어보세요: 경량 삭제 문서.
삭제 뮤테이션 (Delete mutations)
삭제 뮤테이션은 ALTER TABLE ... DELETE 명령으로 발행할 수 있습니다. 예:
-- delete all data from 2018 with a mutation. Not recommended.
ALTER TABLE posts DELETE WHERE toYear(CreationDate) = 2018
이것들은 동기적으로(비복제일 때 기본) 또는 비동기적으로(mutations_sync 설정에 따라) 실행될 수 있습니다. 이것들은 매우 I/O가 많아 WHERE 표현식과 일치하는 모든 파트를 다시 씁니다. 이 과정에는 원자성이 없습니다 — 파트가 준비되는 대로 뮤테이션된 파트로 대체되고, 뮤테이션 중에 실행을 시작한 SELECT 쿼리는 이미 뮤테이션된 파트의 데이터와 아직 뮤테이션되지 않은 파트의 데이터를 함께 보게 됩니다. 사용자는 system.mutations 테이블로 진행 상태를 추적할 수 있습니다. 이것은 I/O 집약적 연산이며, 클러스터 SELECT 성능에 영향을 줄 수 있으므로 아껴 사용해야 합니다.
삭제 뮤테이션에 대해 더 읽어보세요: 삭제 뮤테이션 문서.
테이블 비우기 (Truncate table)
테이블의 모든 데이터를 삭제해야 한다면 아래의 TRUNCATE TABLE 명령을 사용하세요. 이것은 가벼운 연산입니다.
TRUNCATE TABLE posts
TRUNCATE TABLE에 대해 더 읽어보세요: Truncate 문서.
파티션 삭제 (Drop partition)
데이터에 커스텀 파티셔닝 키를 지정했다면 파티션을 효율적으로 삭제할 수 있습니다. 높은 카디널리티 파티셔닝은 피하세요.
ALTER TABLE posts (DROP PARTITION '2008')
DROP PARTITION에 대해 더 읽어보세요: 파티션 삭제 문서.