[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) ๋“ฑ์ด ์ œ๊ณต๋œ๋‹ค.

์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ค ์ธ๋ฑ์Šค๋ฅผ ํƒ€๋Š”์ง€๋Š” ๋‹ค์Œ ํ‘œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

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