[Clickhouse] Secondary Index (Skip Index)
Clickhouse๋ ๋ค๋ฅธ DB๋ค๊ณผ ๋น์ทํ๊ฒ, ์ฟผ๋ฆฌ ์ต์ ํ๋ฅผ ์ํ ๋ณด์กฐ ์ธ๋ฑ์ค๋ฅผ ์ ๊ณตํ๋ค.
MergeTree ๊ณ์ด ์์ง์๋ง ์ ์ฉ๋๋ค.
์ฟผ๋ฆฌ์ ํ๋๊ณผ ์ฑ๋ฅ์ ๋ถ์ํ๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ ๋ณ๋ ํฌ์คํธ๋ฅผ ์ฐธ์กฐํ๋ค.
https://blog.naver.com/sssang97/223926031319
Skip Index
clickhouse์ ๋ณด์กฐ ์ธ๋ฑ์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํต ์ธ๋ฑ์ค๋ค.
๋ค๋ฅธ DB์ ๋ณด์กฐ ์ธ๋ฑ์ค๊ฐ ์ผ์นํ๋ ํ์ ์ ํํ๊ฒ ์๋ณํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค๋ฉด, Clickhouse์ ์ธ๋ฑ์ค๋ ๋์คํฌ ๋ธ๋ก ๋จ์(granule)๋ฅผ ์ค์บํ๊ธฐ ์ ์ ์ด๊ฑธ ์ค์บํด์ผ ํ๋์ง ์๋์ง ์ ํํ๊ธฐ ์ํ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ๋๋ค.
์ต์ ํ ๊ตฌ์กฐ์ ๋ํด์ ์๊ณ ์ถ๋ค๋ฉด ๋ณ๋ ํฌ์คํธ๋ฅผ ์ฐธ์กฐํ๋ค.
https://blog.naver.com/sssang97/223652951126
๊ทธ๋์ ์ด Secondary ์ธ๋ฑ์ค๋ ๊ธฐ๋ํ ๊ฒ๋งํผ์ ์ง๊ด์ ์ธ ์ฑ๋ฅ ํฅ์์ ๋ด๊ธฐ ์ด๋ ค์ธ ์๋ ์๋ค.
์ต์ ํ๋ ๊ธฐ๋ณธํค ์ ํ, projection, materialized view๋ฅผ ๊ฒํ ํด๋ณธ ์ดํ์๋ ์ฑ๋ฅ์ด ์ถฉ๋ถํ์ง ์๋ค๋ฉด ๋ง์ง๋ง ๋ฐฉ๋ฒ์ผ๋ก ์ ํํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค.
์ธ๋ฑ์ค ์ถ๊ฐ
์ธ๋ฑ์ค ์ถ๊ฐ ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
ALTER TABLE ํ
์ด๋ธ๋ช
ADD INDEX ์ธ๋ฑ์ค๋ช
์ปฌ๋ผ๋ช
TYPE ์ธ๋ฑ์คํ์
GRANULARITY N;
์ฌ์ฉ์ฌ๋ก์ ๋ฐ๋ผ ์ธ๋ฑ์ค ํ์
์ ์ ์กฐ์ ํด์ผ ํ๋ค.
GRANULARITY N์ ๋ช๊ฐ์ GRANUL(๋ธ๋ญ)์ ์คํต ๋จ์๋ก ๋ฌถ์์ง๋ฅผ ์ง์ ํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก๋ ํ ๋จ์๋ก ์คํตํ๋๊ฒ ์๋๋ผ ๊ทธ๋๋ผ ๋จ์๋ก ์คํตํ๋๊ฑฐ๋ผ์, ๋ฐ์ดํฐ ๊ท๋ชจ๊ฐ ํฌ๊ณ ๋ถํฌ๊ฐ ํฌ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ํจ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ์ด๋ ต๋ค.
๊ทธ๋ฆฌ๊ณ ์ธ๋ฑ์ค๋ก ์ธํ ํจ๊ณผ๋ ๋ฐ๋ก ์ ์ฉ๋์ง ์์ ์ ์๋ค. ๋ธ๋ญ์ด ์ถฉ๋ถํ ๋ณํฉ๋๊ณ ์ธ๋ฑ์ค๊ฐ ์์ ํ๊ฒ ์ ์ฉ๋๋๋ฐ์๋ ๋๋ ์ด๊ฐ ์กด์ฌํ ์ ์๋ค.
๊ฐ์ ๋ก ์ต์ ํ๋ฅผ ์ ๋ํ๋ ค๋ฉด OPTIMIZE ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
OPTIMIZE TABLE ํ
์ด๋ธ FINAL;

์ธ๋ฑ์ค ํ์
์ธ๋ฑ์ค ํ์ ์๋ bloom_filter, minmax, set(max_rows) ๋ฑ์ด ์ ๊ณต๋๋ค.
-
bloom_filter๋ ํด์ํ ์ด๋ธ์ ๋ณ์ข ์ธ ๋ธ๋ฃธํํฐ๋ฅผ ์์ฉํ skip ๊ตฌ์กฐ๋ค. ๋๋ฑ ๋น๊ต(=)์ ๋ํ ์ธ๋ฑ์ค๋ฅผ ๊ฑด๋ค๋ฉด ์ด๊ฒ์ ์ฐ์ ๊ณ ๋ คํ๋ค.
์ค์ฐจ๊ฐ ์๋ ์๊ณ ๋ฆฌ์ฆ์ด์ง๋ง "์๋ค"๊ณ ํ๋จํ ๊ฒ์ ์ ํํ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ํฐ ๋ฐ์ดํฐ์ ๋ํด์ ์๋นํ ํจ์จ์ ์ผ๋ก skip์ ์ฒ๋ฆฌํ ์ ์๋ค.
์๋ฆฌ์ ๋ํด์๋ ๋ณ๋ ํฌ์คํธ๋ฅผ ์ฐธ์กฐํ๋ค.
https://blog.naver.com/sssang97/223231946274 -
minmax๋ ๋จ์ํ ๊ตฌ์กฐ์ skipping ์ธ๋ฑ์ค๋ค.
๊ทธ๋๋ผ๋ง๋ค ์ต์-์ต๋๊ฐ์ ์ ์ฅํด๋๊ณ , ๊ฑฐ๊ธฐ์ ๊ฑธ๋ฆฌ์ง ์์ผ๋ฉด skipํ๊ฒ ํ๋ ๊ฒ์ด๋ค.
BETWEEN, >, < ๊ฐ์ ๋ฒ์ ๊ธฐ๋ฐ ํํฐ์ ์ ํฉํ๋ค. -
**set(max_rows)**๋ ๋จ์ํ๊ณ ๊ฐ๋ณ์ง๋ง ์ ์ฝ์ด ์๋ ์ธ๋ฑ์ค๋ค.
์ฌ๊ธฐ์ ๋ธ๋ก์ ๋ชจ๋ ๊ฐ์ ์ ์ฅํด๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด set์ ํํฐ ๋์ ๊ฐ์ด ์์ผ๋ฉด ์ค์บํ๊ณ , ์์ผ๋ฉด skipํ๋ ๊ฒ์ด๋ค.
set(0)์ด๋ผ๋ฉด ํ๊ณ ์์ด ์ ์ฅํ๊ณ , set(100)์ด๋ผ๋ฉด 100๊ฐ๊น์ง ์ ์ฅํ๋ค. ํ๊ณ๋ฅผ ์ ํ์๋ ํ๊ณ๋ฅผ ๋์ผ๋ฉด ๋น ๊ฒ์ผ๋ก ์ฒ๋ฆฌํด์ skip์ ํ์ง ์๋๋ค.
๋จ์ผ ๊ทธ๋๋ผ ๋ด์์๋ ์นด๋๋๋ฆฌํฐ(๊ฐ์ ์ข ๋ฅ)๊ฐ ๋ฎ์ง๋ง ์ ์ฒด ๋ฐ์ดํฐ์ ๊ธฐ์ค์ผ๋ก๋ ์นด๋๋๋ฆฌํฐ๊ฐ ๋์ ๊ฒฝ์ฐ์ ํจ์จ์ ์ผ๋ก ๋์ํ๋ค.
์ด๋ค ์ํฉ์์ ์ด๋ค ์ธ๋ฑ์ค๋ฅผ ํ๋์ง๋ ๋ค์ ํ๋ฅผ ์ฐธ์กฐํ๋ค.
https://clickhouse.com/docs/engines/table-engines/mergetree-family/mergetree#functions-support
์ธ๋ฑ์ค ์ฌ์ฉ๋ก: Bloom Filter
๋ธ๋ฃธํํฐ๋ ์ผ๋ฐ์ ์ธ ๋๋ฑ๊ฒ์(=)์ ์ต์ ํ๋ ํด์ ๊ธฐ๋ฐ์ ์ธ๋ฑ์ค๋ค.
์ด๋ฐ ํ ์ด๋ธ์ด ํ๋ ์๋ค๊ณ ๊ฐ์ ํ๊ณ , ๋ธ๋ฃธํํฐ๋ฅผ ์ ์ฉํด๋ณด๊ฒ ๋ค.

๊ทธ๋ฅ ์ด๋ฐ ์ฟผ๋ฆฌ๋ฅผ ์ ๋นํ ๋ ๋ ค๋ณธ๋ค๊ณ ๊ฐ์ ํ๊ฒ ๋ค.

์ฌ์ค ๊ทธ๋ ๊ฒ ๋๋ฆฌ์ง๋ ์๋ค. ์ธ๋ฑ์ค๋ฅผ ํ๋์ง ์๋์ง๋ง ํ์ธํด๋ณด๊ฒ ๋ค.
์กฐ๊ฑด์ ๋ถํฉํ๋ ์ธ๋ฑ์ค๋ฅผ 2๊ฐ ์ถ๊ฐํ๋ค.
ALTER TABLE llm_request ADD INDEX idx_bloom request_type TYPE bloom_filter GRANULARITY 1;
ALTER TABLE llm_request ADD INDEX idx_bloom_2 status TYPE bloom_filter GRANULARITY 1;

๊ทธ๋ฆฌ๊ณ , ์คํํด์ ์ธ๋ฑ์ค๋ฅผ ํ๋์ง ํ์ธํด๋ณด์.
์ด๊ฑด Primary Index๊ฐ ์๋๋ผ Explain์ ์กํ์ง ์๋๋ค.
๋ก๊ทธ๋ ๋ฒจ์ ์กฐ์ ํด์ ์ฟผ๋ฆฌ๋ฅผ ์ด๋ด์ผ ํ๋ค.
SET send_logs_level = 'trace'

๊ทธ๋ผ ์ด๋ฐ ์์ผ๋ก ๋ช๊ฐ์ ๊ทธ๋๋ผ์ด ์ด ์คํต์ธ๋ฑ์ค๋ก ์ธํด์ ์คํต๋์๋์ง ๋ณผ ์ ์๋ค.
์ฌ์ค ์ด ๊ฒฝ์ฐ์๋ ์ ๊ฐ๊ฐ์ ๊ฐ์ด ์นด๋๋๋ฆฌํฐ๊ฐ ๋ฎ์, ํํ๊ฒ ๋ถํฌ๋์ด์๋ ๊ฐ์ด๋ผ ์คํต์ด ์ ํ ๋์ง ์์๋ค.

์ด๋ฐ ๊ฒฝ์ฐ๋ ์ธ๋ฑ์ค๊ฐ ํจ๊ณผ์ ์ด์ง ์์ ๊ฒ์ด๋ค.
๊ทธ๋๋ง ํฌ์ํ "create-description"์ผ๋ก ํํฐ๋ฅผ ํด๋ณด์.


๊ทธ๋ฌ๋๋ ์ด๋ฒ์๋ ์คํต์ด ๋ฐ์ํ๊ธด ํ๋ค. ๋ค๋ง 3% ์ ๋๋ก ๋งค์ฐ ๋ฏธ๋ฏธํ๊ธด ํ๋ค.
์ด๋ฒ์๋ ์กด์ฌํ์ง ์๋ ๊ฐ์ผ๋ก ํํฐ๋ง์ ํด๋ณด์.


๊ทธ๋ผ ์ด๋ฒ์๋ ๋ชจ๋ ๋ธ๋ญ์ ์คํตํ๊ณ , ๊ทธ๋์ 0.013์ด๋ก ๋งค์ฐ ๋น ๋ฅด๊ฒ ์คํ๋๋ค.
๊ทธ๋์ clickhouse์ Secondardy ์ธ๋ฑ์ค๋ ๊ธฐ์กด DB์ ์ธ๋ฑ์ค์ ๋น์ทํ ๊ด์ ์ผ๋ก ์ ๊ทผํด์๋ ์๋๋ค.
๊ฐ์ง๋ฐ ๊ฐ์ ๋ถํฌ๊ฐ ๋๊ณ ํฌ์ํ์ง ์๋ค๋ฉด, ์์ฒ-์๋ง๊ฐ์ ํ๋ง๋ค ์ด์ง๊ฐํด์๋ ๊ฐ์ด ๋ค์ด์ ์คํต์ด ์ ์๋ํ์ง ์์ ํ๋ฅ ์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ฐธ์กฐ
https://clickhouse.com/docs/optimize/skipping-indexes