โDB๊ฐ ๋๋ ค์ก๋๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ค์ ์ ์ข ๋๋ ค๋ณผ๊น์?โ
PostgreSQL ์ด์ ์ค ์ฑ๋ฅ ์ด์๊ฐ ๋ฐ์ํ์ ๋, ๊ฐ์ฅ ๋จผ์ postgresql.conf ํ์ผ์ ์ด์ด shared_buffers๋ถํฐ ์์ ํ๊ณ ๊ณ์์ง ์๋์?
๋ฌผ๋ก ์ค์ ํ๋์ ์ค์ํฉ๋๋ค. ํ์ง๋ง ์ ์ฒด ์ต์ ํ ์ฌ์ ์์ ๋ณด๋ฉด ๊ทธ๊ฒ์ **๊ฐ์ฅ ๋ง์ง๋ง ๋จ๊ณ(Last Mile)**์ ๋ถ๊ณผํฉ๋๋ค. ์ง์ ํ ์ฑ๋ฅ ํฅ์์ ๋ฐ๋ฅ๋ถํฐ ๊ฒฌ๊ณ ํ๊ฒ ์์ ์ฌ๋ฆฐ 4๊ณ์ธต์ ์ต์ ํ ์ ๋ต์์ ๋์ต๋๋ค.
๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ฆฌํ PostgreSQL Performance Optimization 4-Layer๋ฅผ ๊ณต์ ํฉ๋๋ค.
Layer 1: ์ฟผ๋ฆฌ ๋ฐ SQL ์ต์ ํ (Highest ROI)
๊ฐ์ฅ ์ ์ ๋น์ฉ์ผ๋ก ๊ฐ์ฅ ๋๋ผ๋งํฑํ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๋ ์์ญ์ ๋๋ค. ํ๋์จ์ด๋ฅผ ์ฆ์คํ๊ธฐ ์ ์ ์ฟผ๋ฆฌ๋ฅผ ๋จผ์ ์ง๋จํด์ผ ํฉ๋๋ค.
-
์คํ ๊ณํ์ ์๊ฐํ: EXPLAIN์ผ๋ก ๊ณํ์ ๋ณด๊ณ , EXPLAIN ANALYZE๋ก ์ค์ ์คํ ์๊ฐ๊ณผ ๊ณํ์ ๊ดด๋ฆฌ๋ฅผ ์ฐพ์๋ด์ธ์.
-
๋ฒ์ธ์ ์ฐพ์๋ผ (pg_stat_statements): ์๋ฒ ์ ์ฒด์์ ๊ฐ์ฅ ๋ฆฌ์์ค๋ฅผ ๋ง์ด ์๋ชจํ๋ '๋ฌด๊ฑฐ์ด ์ฟผ๋ฆฌโ๋ฅผ ์๋ณํ๋ ๊ฒ์ด ํ๋์ ์์์ ๋๋ค.
-
์ธ๋ฑ์ค ์ ๋ต์ ๋ค๋ณํ: ๋จ์ํ B-Tree๋ง ๊ณ ์งํ์ง ๋ง์ธ์. GIN: JSONB๋ ๋ฐฐ์ด ๋ฐ์ดํฐ ๊ฒ์. BRIN: ์๊ณ์ด ๋ก๊ทธ ๋ฐ์ดํฐ์ฒ๋ผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ๋ ฌ๋ ์ด๋์ฉ๋ ํ ์ด๋ธ์ ์ต์/์ต๋๊ฐ ์ธ๋ฑ์ฑ. Partial Index: WHERE ์ ์ ํฌํจํด ํน์ ์กฐ๊ฑด(์: ๋ฏธ์ฒ๋ฆฌ ์ฃผ๋ฌธ)๋ง ์ธ๋ฑ์ฑํ์ฌ ํฌ๊ธฐ ์ต์ ํ.
Layer 2: ์ํคํ
์ฒ ๊ฐ์ (Scalability)
ํ ์ด๋ธ ํ(Row) ์๊ฐ ์์ญ์ต ๊ฑด์ ๋์ด๊ฐ๋ฉด, ๋จ์ผ ํ ์ด๋ธ ๊ตฌ์กฐ๋ก๋ ํ๊ณ๊ฐ ์ต๋๋ค. ๋ฌผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ด ํ์ํ ์์ ์ ๋๋ค.
-
ํํฐ์ ๋ (Partitioning): ๊ฑฐ๋ ํ ์ด๋ธ์ ์๊ฐ(Range), ์ง์ญ(List), ํด์(Hash) ๊ธฐ์ค์ผ๋ก ์ชผ๊ฐ์ธ์. ์ฟผ๋ฆฌ ํ๋๋๊ฐ ๋ถํ์ํ ํํฐ์ ์ ์ค์บ ๋์์์ ์ ์ธํ๋ โํํฐ์ ํ๋ฃจ๋(Partition Pruning)โ ํจ๊ณผ๋ก I/O๋ฅผ ํ๊ธฐ์ ์ผ๋ก ์ค์ผ ์ ์์ต๋๋ค.
-
์ฝ๊ธฐ ๋ณต์ (Read Replicas): ํธ๋์ญ์ (INSERT/UPDATE)์ Primary๊ฐ, ์กฐํ(SELECT)๋ ๋ณต์ ๋ณธ์ด ์ฒ๋ฆฌํ๋๋ก ๋ถํ๋ฅผ ๋ถ์ฐ์์ผ ์ ์ฒด ์ฒ๋ฆฌ๋(Throughput)์ ๋๋ฆฌ์ธ์.
Layer 3: ๊ณ ๊ธ ๊ธฐ๋ฅ ํ์ฉ (Modern Hardware)
์ต์ ์๋ฒ ํ๋์จ์ด์ ์คํ์ 100% ํ์ฉํ๊ณ ๊ณ์ ๊ฐ์? PostgreSQL์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ผ์ผ ํฉ๋๋ค.
-
๋ณ๋ ฌ ์ฟผ๋ฆฌ (Parallel Query): ๋จ์ผ ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ CPU ์ฝ์ด๊ฐ ๋๋ ์ ์ฒ๋ฆฌํ๊ฒ ๋ง๋์ธ์. max_parallel_workers_per_gather ํ๋์ ํตํด ๋๊ท๋ชจ ์ง๊ณ ์ฟผ๋ฆฌ ์๋๋ฅผ ๋น์ฝ์ ์ผ๋ก ํฅ์์ํฌ ์ ์์ต๋๋ค.
-
NUMA-Aware ๋ฐฐํฌ: ๋ฉํฐ ์์ผ CPU ํ๊ฒฝ์์ ํ๋ก์ธ์ค๊ฐ ์๊ฒฉ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ๋ ๋ฐ์ํ๋ ์ง์ฐ(Latency)์ ๋ง๊ธฐ ์ํด numactl --interleave=all์ ํ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ธํฐ๋ฆฌ๋นํ์ธ์.
-
TOAST & ์์ถ: 2KB๊ฐ ๋๋ ํ ์คํธ๋ JSON ๋ฐ์ดํฐ๋ ์๋์ผ๋ก ์์ถ ์ ์ฅํ์ฌ ๋ฉ์ธ ํ ์ด๋ธ์ ์บ์ ํจ์จ์ ๋์ ๋๋ค.
Layer 4: ๊ตฌ์ฑ ํ๋ (Fine-Tuning)
์์ ๋จ๊ณ๋ค์ด ์ ํ๋ ํ, ๋ง์ง๋ง์ผ๋ก ์์คํ ๋ฆฌ์์ค๋ฅผ ๋ฏธ์ธ ์กฐ์ ํ์ฌ ๋จ์ 10%์ ์ฑ๋ฅ์ ๋์ด์ฌ๋ฆฝ๋๋ค.
-
๋ฉ๋ชจ๋ฆฌ ์ต์ ํ: shared_buffers: ์ ์ฒด RAM์ 25% ๊ถ์ฅ (๋๋ฌด ํฌ๋ฉด OS ์บ์์ ๊ฒฝ์). work_mem: ์ ๋ ฌ/ํด์ ์์ ์ฉ ๋ฉ๋ชจ๋ฆฌ. ์ฐ๊ฒฐ ์์ ๋ฐ๋ผ ๊ณฑ์ ๋ก ์ฌ์ฉ๋๋ฏ๋ก OOM(Out of Memory)์ ์ฃผ์ํ๋ฉฐ ๋ณด์์ ์ผ๋ก ์ค์ ํ์ธ์.
-
Autovacuum์ ์ ๋ ๋์ง ๋ง์ธ์: ์ฑ๋ฅ ์ ํ๋ฅผ ์ด์ ๋ก Autovacuum์ ๋๋ ๊ฒ์ ์์ดํ์์ ๋๋ค. ์คํ๋ ค autovacuum_vacuum_scale_factor๋ฅผ ๋ฎ์ถฐ์(0.01~0.05) โ๋ ์์ฃผ, ์กฐ๊ธ์ฉโ ์ฒญ์ํ๊ฒ ๋ง๋ค์ด ๋ธ๋กํธ(Bloat)๋ฅผ ์๋ฐฉํ๋ ๊ฒ์ด ์ ์์ ๋๋ค.
๊ฒฐ๋ก
PostgreSQL์ ์ฑ๋ฅ ์ต์ ํ๋ '์ค์ (Config)'์ด ์๋๋ผ '์ง๋จ(Analysis)'์์ ์์ํฉ๋๋ค. ์ฟผ๋ฆฌ ๋ ๋ฒจ์์ ๋นํจ์จ์ ์ ๊ฑฐํ๊ณ , ์ํคํ ์ฒ๋ก ํ์ฅ์ฑ์ ํ๋ณดํ ๋ค, ํ๋์จ์ด ๊ธฐ๋ฅ์ ๊ทน๋ํํ๊ณ ๋์์ผ ๋น๋ก์ ํ๋ผ๋ฏธํฐ ํ๋์ด ๋น์ ๋ฐํฉ๋๋ค.
์ฌ๋ฌ๋ถ์ DB๋ ์ง๊ธ ์ด๋ค ๋ ์ด์ด์์ ๋ณ๋ชฉ์ ๊ฒช๊ณ ์๋์?