[Clickhouse] Engine: CollapsingMergeTree
CollapsingMergeTree๋ MergeTree์ ์ฃผ์ ๋ณํ ์์ง ์ค ํ๋๋ค.
์ฆ์ ์์ ๊ณผ ์ญ์ ์ ๋ํด์ ์กฐ๊ธ ๋ ํฅ์๋ ์ฑ๋ฅ์ ๋ณด์ฅํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
์๋นํ ๊ธฐ๋ฌํ ๋์ ๋ฐฉ์์ ๊ฐ์ง ์์ง์ด๋ค.
์ด๊ฑด ๋์ผํ ์ ๋ ฌํค์ ๋ํ ๊ฐ์ ์์๋ฉธ์ํค๋ ๋ด๋ถ๋์์ ๊ฐ์ง๋ค.
ํ ์ด๋ธ์ ์ด๋ฐ ์์ผ๋ก ์์ฑํ ์ ์๋ค.
create table items
(
id String,
value String,
sign Int8
) ENGINE = CollapsingMergeTree(sign)
ORDER BY id
CollapsingMergeTree์ "sign" ํ๋๊ฐ ๋ณ๋๋ก ํ์ํ๋ฐ, ์ด๊ฑด 1/-1 ๊ฐ์ ๊ฐ์ง๋ ์ ์๊ฐ์ด์ด์ผ ํ๋ค. ๊ทธ ์ด์ธ์ ๊ฐ์ ๋ฃ์ ์ ์๋ค.
ํ๋ฒ ๊ฐ์ ํค์ ๊ฐ์ ๋ฃ์ด๋ณด๊ฒ ๋ค.
๋ฃ๋ ๊ฒ ์์ฒด๋ ๋ฌธ์ ์์ด ๋ค์ด๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ , ๋น์ฐํ ํค๋ ์ค๋ณต์ ํ์ฉํ๋ค.
ํ์ง๋ง Merge๊ฐ ์คํ๋๋ฉด ๋ณํฉ์ด ๋๊ธด ํ๋ค.
optimize๋ก merge๋ฅผ ํธ๋ฆฌ๊ฑฐํด๋ณด๋ฉด

์ต์ ๊ฐ๋ง ๋ณด์กดํ๊ณ ๋ ๋ ค๋ฒ๋ฆด ๊ฒ์ด๋ค.
์ฌ๊ธฐ๊น์ง๋ ReplacingMergeTree์ ๋์๊ณผ ๋น์ทํด๋ณด์ธ๋ค. ๊ทธ๋ผ ๋ญ๊ฐ ๋ค๋ฅผ๊น?
๊ฐ์ ํค์ sign์ด ๋ค๋ฅธ ๊ฐ์ 2๊ฐ ๋ฃ์ด๋ณด๊ณ , merge๋ฅผ ๋๋ฆฌ๋ฉด

๊ทธ ๊ฐ์ ํค๋ฅผ ๊ฐ์ก๋ ๊ฐ์ด ํฉ์ณ์ง๋๊ฒ ์๋๋ผ ์์ผ๋ก ๋ ๋ผ๊ฐ๋ฒ๋ฆฐ๋ค.
์ ํํ 1:1๋ก ๋ ๋ฆฌ๋ ๊ฑฐ๋ผ์, ์์ชฝ์ด ๋น๋์นญ์ด๋ฉด ๋ง์ ์ชฝ๋ง ๋จ๋๋ค.
๊ทธ๋์ 1์ ๋ ๋ง๊ฒ ๋จ๊ฒจ๋์ผ๋ฉด

์์๋ฉธํ๋ฉด์ 1์ธ ๊ฒ๋ง ๋จ๊ณ
๋ฐ๋๋ก -1์ด ๋ ๋ง์ผ๋ฉด

์์๋ฉธํ๋ฉด์ -1์ธ ๊ฒ๋ง ๋จ๋๋ค.
๊ทธ๋์ ์ด๊ฑธ ์ด๋๋ค ์ฐ๋๊ฐ?
์ด ์์ง์ ๊ฐ์ ์, ๋น๋ฒํ UPDATE์ DELETE๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
์ผ๋ฐ์ ์ธ INSERT๋ sign=1๋ก ๊ทธ๋ฅ ๋ฃ๋ค๊ฐ, ์์ /์ญ์ ๋ฅผ ํ ๋ sign=-1๋ก ๊ฐ์ ์ถฉ๋์ํค๋ ์์ผ๋ก ์์ฉํ๋ค.
์ญ์ ์ ๊ฒฝ์ฐ์๋ ์ด๋ฐ ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
์ญ์ ํ ํ์๊ฐ ์์ผ๋ฉด ๊ฑฐ๊ธฐ์ DELETE๋ฅผ ๋ ๋ฆฌ๋๊ฒ ์๋๋ผ ๋์ผํ ํค๊ฐ์ sign=-1์ธ ํ์ ์ฝ์
ํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ๋น์ฐํ merge๊ฐ ์คํ๋ ๋ ์๋์ผ๋ก ์ญ์ ๋ฅผ ํด์ค ๊ฒ์ด๊ณ , ๋น์ฐํ ํ๋์ฉ DELETE๋ฅผ ๋ ๋ฆฌ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ํจ์จ์ ์ด๋ค.
์์ ์ ๊ฒฝ์ฐ์๋ ์ด๋ฐ ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
sign=-1๊ฐ๊ณผ ์์ ํ ๊ฐ์ ๋ด์ sign=1 ๊ฐ 2๊ฐ๋ฅผ INSERTํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด merge๊ฐ ์คํ๋ ๋ ์๋ ๊ฐ์ ์์์ ์์๋ฉธํด์ ์ฌ๋ผ์ง๊ณ , ์ต์ ๊ฐ๋ง ๋จ๊ฒ ๋๋ค.
์ฐธ์กฐ
https://clickhouse.com/docs/engines/table-engines/mergetree-family/collapsingmergetree