ClickHouse์์ ์๋ชป ์ ์ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ง์์ผ ํ๋ ์ํฉ์ด ์๊ฒผ๋ค.
MySQL์ด๋ผ๋ฉด ๊ทธ๋ฅ DELETE FROM ... WHERE ... ๋ ๋ฆฌ๋ฉด ๋์ธ๋ฐ, ClickHouse ํด๋ฌ์คํฐ ํ๊ฒฝ์์๋ ๊ทธ๊ฒ ์ ๋๋ค. DELETE FROM ๋ฌธ๋ฒ ์์ฒด๋ ์กด์ฌํ์ง๋ง, ON CLUSTER๋ฅผ ์ง์ํ์ง ์์ ํด๋ฌ์คํฐ ์ ์ฒด์ ์ ์ฉ๋์ง ์๋๋ค. ํด๋ฌ์คํฐ ํ๊ฒฝ์์๋ ๋ฐ๋์ ALTER TABLE ... DELETE๋ DROP PARTITION์ ์จ์ผ ํ๋ค.
์ด ๊ธ์ ํด๋ฌ์คํฐ ํ๊ฒฝ์ ์ ์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ธ ALTER DELETE์ DROP PARTITION์ ๋น๊ตํ๊ณ , ๊ฐ๊ฐ ์ธ์ ์ฐ๋ ๊ฒ ๋ง๋์ง ์ ๋ฆฌํ๋ค.
๋ฐฉ๋ฒ ์ ํ์ ๊ธฐ์ค์ ๋ฐ์ดํฐ ์์ด ์๋๋ผ ์ญ์ ํจํด์ด๋ค. ์์ ์์ด๋ผ๋ ALTER DELETE๋ ํํธ ์ฌ์์ฑ์ด ํ์ํ ๊ตฌ์กฐ๋ผ ๋๋ฆฌ๊ณ , DROP PARTITION์ ์ฉ๋๊ณผ ๋ฌด๊ดํ๊ฒ ๋น ๋ฅด๋ค. ํํฐ์
๋จ์๋ก ํต์งธ๋ก ๊ต์ฒดํ ์ ์๋ ์ํฉ์ธ๊ฐ๊ฐ ๊ธฐ์ค์ด๋ค.
ClickHouse์์ DELETE๊ฐ ๋๋ฆฐ ์ด์

ClickHouse๋ ๋ฐ์ดํฐ๋ฅผ ํํธ(Part) ๋จ์๋ก ๋์คํฌ์ ์ ์ฅํ๋ค. INSERT๊ฐ ๋ค์ด์ฌ ๋๋ง๋ค ์๋ก์ด ํํธ๊ฐ ์์ฑ๋๊ณ , ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฃผ๊ธฐ์ ์ผ๋ก ํํธ๋ค์ ๋ณํฉ(Merge)ํ๋ค.
์ด ๊ตฌ์กฐ ๋๋ถ์ ๋์ฉ๋ INSERT์ SELECT๊ฐ ๋น ๋ฅด์ง๋ง, ๋ฐ๋๋ก ํน์ ํ๋ง ๊ณจ๋ผ์ ์ญ์ ํ๋ ๊ฑด ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ด๋ค. ํด๋น ํํธ ์ ์ฒด๋ฅผ ์ฝ์ด์ ์กฐ๊ฑด์ ๋ง๋ ํ์ ์ ์ธํ ๋ค ์ ํํธ๋ก ๋ค์ ์จ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๊ฒ ๋ฐ๋ก ClickHouse์ ์ญ์ ๋ฐฉ์์ธ Mutation์ด๋ค.
๋ฐฉ๋ฒ 1: ALTER DELETE (Mutation)
ALTER TABLE local.user_events_local ON CLUSTER my_cluster
DELETE WHERE event_date = '2026-03-18';
๋์ ๋ฐฉ์

์ญ์ ์์ ์ด Mutation ํ์ ๋ฑ๋ก๋๊ณ , ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋๋ค. ๋์ ํํธ๋ฅผ ๋์คํฌ์์ ์ฝ์ด ์กฐ๊ฑด์ ํด๋นํ๋ ํ์ ์ ์ธํ ๋ค ์ ํํธ๋ก ์ฌ์์ฑํ๋ค.
๊ธฐ๋ณธ๊ฐ์ ๋น๋๊ธฐ๋ผ ์ฟผ๋ฆฌ๊ฐ ๋ฐ๋ก ๋ฐํ๋์ง๋ง, ์ญ์ ๊ฐ ์์ ํ ๋๋ฌ๋ค๋ ๋ณด์ฅ์ด ์๋ค. ๋ชจ๋ Replica์์ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ค๋ฉด mutations_sync ์ค์ ์ ์ถ๊ฐํ๋ค.
ALTER TABLE local.user_events_local ON CLUSTER my_cluster
DELETE WHERE event_date = '2026-03-18'
SETTINGS mutations_sync = 2; -- 0: ๋น๋๊ธฐ(๊ธฐ๋ณธ), 1: ํ์ฌ ์๋ฒ ์๋ฃ ๋๊ธฐ, 2: ๋ชจ๋ Replica ์๋ฃ ๋๊ธฐ
ํน์ง
- ์กฐ๊ฑด๋ถ ์ญ์ ๊ฐ๋ฅ :
WHERE์ ๋ก ์ํ๋ ํ๋ง ์ ํํ ์ ๊ฑฐํ ์ ์๋ค. - ๋๋ฆฌ๊ณ ๋์ I/O ๋น์ฉ : ํํธ ์ ์ฒด๋ฅผ ์ฌ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋๋ฆฌ๋ค.
ON CLUSTER์ง์ : ๊ฐ Shard๋ก ์๋ ์ ํ๋๋ค. ํด๋ฌ์คํฐ ํ๊ฒฝ์์ ์กฐ๊ฑด๋ถ ์ญ์ ๊ฐ ํ์ํ๋ค๋ฉด ์ด ๋ฐฉ๋ฒ๋ง ๊ฐ๋ฅํ๋ค.
๋ฐฉ๋ฒ 2: DROP PARTITION
-- ๋ฐ๋์ ๋ก์ปฌ ํ
์ด๋ธ + ON CLUSTER ์กฐํฉ์ผ๋ก ์คํ
ALTER TABLE local.user_events_local ON CLUSTER my_cluster
DROP PARTITION '20260318';
๋์ ๋ฐฉ์

ํํฐ์ ์ ๋นํ์ฑ ์ํ๋ก ํ์ํ๊ณ ์ฝ 10๋ถ ํ ์์ ํ ์ญ์ ํ๋ค. ํํธ๋ฅผ ์ฝ๊ฑฐ๋ ์ฌ์์ฑํ์ง ์๊ณ ํต์งธ๋ก ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋น ๋ฅด๋ค. ์ฟผ๋ฆฌ ๋ฐํ ์์ ์๋ ์ด๋ฏธ ํด๋น ํํฐ์ ์ด ์กฐํ์์ ์ ์ธ๋๋ฏ๋ก ์ฒด๊ฐ์ ์ฆ์ ์ญ์ ์ฒ๋ผ ๋์ํ๋ค.
ํน์ง
- ๋น ๋ฅด๊ณ ๋ฎ์ I/O ๋น์ฉ
- ํํฐ์ ๋จ์๋ก๋ง ์ญ์ ๊ฐ๋ฅ : ์กฐ๊ฑด๋ถ ์ญ์ ๋ถ๊ฐ. ํํฐ์ ํค ๋จ์๋ก๋ง ๋์ด์ ์ง์ธ ์ ์๋ค.
- Distributed ํ
์ด๋ธ์์ ์คํํ๋ฉด ์ ๋จ : ๋ฐ๋์
๋ก์ปฌ ํ ์ด๋ธ + ON CLUSTER์กฐํฉ์ผ๋ก ์คํํด์ผ ํ๋ค.
๋น๊ต
| ํญ๋ชฉ | ALTER DELETE | DROP PARTITION |
|---|---|---|
| ์๋ | ๋๋ฆผ | ๋น ๋ฆ |
| I/O | ๋์ | ๋ฎ์ |
| ์ญ์ ๋จ์ | ํ ๋จ์ (์กฐ๊ฑด๋ถ) | ํํฐ์ ๋จ์ |
ON CLUSTER ์ง์ |
์ง์ | ๋ก์ปฌ ํ ์ด๋ธ์์๋ง |
| Distributed ํ ์ด๋ธ ์คํ | ์๋ ์ ํ | ํ ๋ ธ๋์๋ง ์ ์ฉ |
| ์ฆ์ ๋ฐ์ | ๋น๋๊ธฐ (๊ธฐ๋ณธ) | ๋นํ์ฑ ์ฆ์ / ์ค์ ์ญ์ ~10๋ถ ํ |
| ์ ํฉํ ๊ฒฝ์ฐ | ํน์ ์กฐ๊ฑด์ ์ผ๋ถ ํ ์ญ์ | ๋ ์ง ๋จ์ ์ ์ฒด ์ฌ์ฒ๋ฆฌ |
์ธ์ ๋ญ ์จ์ผ ํ๋?
DROP PARTITION์ ์ฐ๋ ๊ฒฝ์ฐ
ํ ์ด๋ธ ํํฐ์ ์ด ๋ ์ง ๋จ์๋ก ๋๋์ด ์๊ณ , ํน์ ๋ ์ง ๋ฐ์ดํฐ๋ฅผ ํต์งธ๋ก ๋ค์ ์ ์ฌํด์ผ ํ ๋ ์ ํฉํ๋ค.
์๋ฅผ ๋ค์ด ๋ฐฐ์น ์ก์ด ํน์ ๋ ์ง์ ์๋ชป๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฌํ๊ณ , ํด๋น ๋ ์ง ์ ์ฒด๋ฅผ ์ง์ฐ๊ณ ๋ค์ ๋ฃ์ด์ผ ํ๋ ์ํฉ์ด๋ค. ๋ฐ์ดํฐ ์์ ์๊ด์์ด ๋น ๋ฅด๊ณ , ์ง์ฐ๊ณ ๋ค์ ๋ฃ๋ ํจํด์ด ๊ฐ์ฅ ๊น๋ํ๋ค.
-- 1. ์๋ชป๋ ํํฐ์
์ญ์
ALTER TABLE local.user_events_local ON CLUSTER my_cluster
DROP PARTITION '20260318';
-- 2. ์ฌ๋ฐ๋ฅธ ๋ฐ์ดํฐ ์ฌ์ ์ฌ
INSERT INTO default.user_events SELECT ...
ALTER DELETE๋ฅผ ์ฐ๋ ๊ฒฝ์ฐ
ํํฐ์ ๊ฒฝ๊ณ์ ๋ฌด๊ดํ๊ฒ ํน์ ์กฐ๊ฑด์ ํ๋ง ๊ณจ๋ผ์ ์ง์์ผ ํ ๋ ์ฌ์ฉํ๋ค. ์ฌ๋ฌ ํํฐ์ ์ ๊ฑธ์ณ์๋ ํน์ ์กฐ๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ์ง์์ผ ํ๊ฑฐ๋, ํํฐ์ ๋จ์๋ก ๋๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๋ค. ๋จ, ๋๋ฆฌ๋ค๋ ์ ์ ๊ฐ์ํด์ผ ํ๋ค.
-- ํน์ ์ฌ์ฉ์์ ์ด๋ฒคํธ ๋ฐ์ดํฐ๋ง ์ญ์
ALTER TABLE local.user_events_local ON CLUSTER my_cluster
DELETE WHERE user_id = 12345
SETTINGS mutations_sync = 2;
์ฐธ๊ณ ๋ก DELETE FROM table WHERE ... ๋ฌธ๋ฒ์ ํด๋ฌ์คํฐ ํ๊ฒฝ์์ ์ธ ์ ์๋ค. ON CLUSTER๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋จ์ผ ๋
ธ๋์๋ง ์ ์ฉ๋๋ค. ํด๋ฌ์คํฐ ํ๊ฒฝ์์๋ ๋ฐ๋์ ALTER TABLE ... DELETE ON CLUSTER ํํ๋ก ์คํํด์ผ ํ๋ค.
์ ๋ฆฌ
- ํน์ ๋ ์ง(ํํฐ์
) ๋ฐ์ดํฐ๋ฅผ ํต์งธ๋ก ์ฌ์ฒ๋ฆฌํด์ผ ํ๋ค →
DROP PARTITION. ๋ฐ์ดํฐ ์์ ์๊ด์์ด ๋น ๋ฅด๋ค. - ํํฐ์
๊ฒฝ๊ณ์ ๋ฌด๊ดํ๊ฒ ํน์ ์กฐ๊ฑด์ ํ๋ง ๊ณจ๋ผ์ ์ง์์ผ ํ๋ค →
ALTER DELETE ON CLUSTER. ๋๋ฆฐ ๊ฑด ๊ฐ์ํด์ผ ํ๋ค. - ์๋ row ์ญ์ ๊ฐ ์ฆ๋ค → ClickHouse ์์ฒด๊ฐ ๋ง์ง ์๋๋ค.
๋ง์น๋ฉฐ
ClickHouse์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ๋ ๊ฑด MySQL์ฒ๋ผ ๊ฐ๋ณ์ง ์๋ค. ํนํ ํด๋ฌ์คํฐ ํ๊ฒฝ์์๋ DELETE FROM ๊ฐ์ ํธ์ ๋ฌธ๋ฒ๋ ์ธ ์ ์๋ค. ๊ทธ๋์ ์ฒ์๋ถํฐ "์๋ชป ๋ค์ด์ค๋ฉด ์ด๋ป๊ฒ ๊ณ ์น ๊ฒ์ธ๊ฐ"๋ฅผ ์ค๊ณ ๋จ๊ณ์์ ํจ๊ป ๊ณ ๋ คํ๋ ๊ฒ ์ข๋ค.
ํํฐ์
์ ์ ์ค๊ณํด๋๋ฉด ์ฌ์ฒ๋ฆฌ๊ฐ ํ์ํ ๋ DROP PARTITION์ผ๋ก ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค. ๋ฐ๋๋ก ํํฐ์
์ค๊ณ๊ฐ ์๋ชป๋๋ฉด ๋งค๋ฒ ๋๋ฆฐ ALTER DELETE์ ์์กดํ๊ฒ ๋๋ค.
๊ฒฐ๊ตญ ๋ณด์ ๋ฐฉ์์ ์ ํ์ ํ ์ด๋ธ ์ค๊ณ์์ ์ด๋ฏธ ๊ฒฐ์ ๋๋ค๊ณ ํ ์ ์๋ค.
์ฐธ๊ณ
Handling Updates and Deletes in ClickHouse
With the recent addition of Lightweight Deletes, read about the latest best practices for handling updates and deletes in ClickHouse.
clickhouse.com
'DB > ClickHouse' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ClickHouse ํด๋ฌ์คํฐ ๊ตฌ์กฐ - Shard, Replica, Distributed ํ ์ด๋ธ (0) | 2026.03.26 |
|---|