ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ PostgreSQL๋ก ์์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ: ์ด๋ก ๊ณผ ์ค์ต - PostgreSQL ์ฑ๋ฅ ์ต์ ํ ๋ฐ ๋ชจ๋ํฐ๋ง
octo54 2025. 3. 10. 10:29๐ PostgreSQL๋ก ์์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ: ์ด๋ก ๊ณผ ์ค์ต
3.3 PostgreSQL ์ฑ๋ฅ ์ต์ ํ ๋ฐ ๋ชจ๋ํฐ๋ง
PostgreSQL์ ์ด์ํ๋ฉด์ ๋น ๋ฅธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์์ ์ ์ธ ์ฑ๋ฅ ์ ์ง๋ ํ์์
๋๋ค.
์ด๋ฒ ๊ธ์์๋ PostgreSQL ์ฑ๋ฅ ์ต์ ํ ๋ฐ ์ค์๊ฐ ๋ชจ๋ํฐ๋ง ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
3.3.1 PostgreSQL ์ฑ๋ฅ ์ต์ ํ ๊ฐ์
PostgreSQL์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ค๋ฉด ๋ค์ ๋ค ๊ฐ์ง ์์๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
โ
์ฟผ๋ฆฌ ์ต์ ํ (EXPLAIN ANALYZE, ์ธ๋ฑ์ค ํ์ฉ)
โ
์๋ฒ ํ๋ (postgresql.conf ์ค์ ์ต์ ํ)
โ
์๋ ๊ด๋ฆฌ(Auto Vacuum) ์ค์
โ
์ค์๊ฐ ๋ชจ๋ํฐ๋ง ๋ฐ ์ฑ๋ฅ ๋ถ์
๊ฐ ํญ๋ชฉ๋ณ๋ก ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
3.3.2 EXPLAIN ANALYZE๋ฅผ ํ์ฉํ ์ฟผ๋ฆฌ ์ต์ ํ
PostgreSQL์์ SQL ์ฟผ๋ฆฌ์ ์ฑ๋ฅ์ ๋ถ์ํ๋ ค๋ฉด EXPLAIN๊ณผ EXPLAIN ANALYZE๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๐น EXPLAIN ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
โ ์ฟผ๋ฆฌ ์คํ ๊ณํ์ ํ์ธํ์ง๋ง ์ค์ ์คํ๋์ง๋ ์์
๐น EXPLAIN ANALYZE ์ฌ์ฉ๋ฒ
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';
โ ์ฟผ๋ฆฌ๋ฅผ ์ค์ ๋ก ์คํํ๊ณ ์คํ ์๊ฐ์ ๋ถ์
๐น ์คํ ๊ณํ ์์
Seq Scan on users (cost=0.00..12.75 rows=1 width=55) (actual time=0.015..0.020 rows=1 loops=1)
โ Seq Scan(์์ฐจ ๊ฒ์) ๋์ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋ฉด ์ฑ๋ฅ ๊ฐ์ ๊ฐ๋ฅ
3.3.3 ์ธ๋ฑ์ค ์ต์ ํ (CREATE INDEX)
PostgreSQL์์๋ ์ฌ๋ฐ๋ฅธ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒ์ ์๋๋ฅผ ํ๊ธฐ์ ์ผ๋ก ๊ฐ์ ํ ์ ์์ต๋๋ค.
๐น ๊ธฐ๋ณธ B-TREE ์ธ๋ฑ์ค ์์ฑ
CREATE INDEX idx_users_email ON users(email);
โ ์ด๋ฉ์ผ ๊ฒ์ ์๋๋ฅผ ํฅ์
๐น ๋ค์ค ์ปฌ๋ผ ์ธ๋ฑ์ค ์์ฑ
CREATE INDEX idx_users_name_email ON users(name, email);
โ ์ฌ๋ฌ ๊ฐ์ ์ปฌ๋ผ์ ์กฐํฉํ์ฌ ๊ฒ์ ์ฑ๋ฅ ๊ฐ์
๐น ์ธ๋ฑ์ค ์ ๊ฑฐ (DROP INDEX)
DROP INDEX idx_users_email;
โ ๋ถํ์ํ ์ธ๋ฑ์ค๋ ์ญ์ ํ์ฌ ์ฐ๊ธฐ ์ฑ๋ฅ์ ํฅ์
๐ก ์ธ๋ฑ์ค๊ฐ ๋ง์ผ๋ฉด INSERT ๋ฐ UPDATE ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ผ๋ฏ๋ก ํ์ํ ๋๋ง ์ถ๊ฐ
3.3.4 postgresql.conf ์๋ฒ ํ๋
PostgreSQL์ ๊ธฐ๋ณธ ์ค์ ๊ฐ์ ๋ชจ๋ ํ๊ฒฝ์ ์ต์ ํ๋์ง ์์
๋ฐ๋ผ์ ์๋ฒ ์ฑ๋ฅ์ ๊ทน๋ํํ๋ ค๋ฉด ์ฃผ์ ์ค์ ์ ํ๋ํด์ผ ํฉ๋๋ค.
๐น ๋ฉ๋ชจ๋ฆฌ ์ค์ ์ต์ ํ
์ค์ ํญ๋ชฉ ์ค๋ช ๊ธฐ๋ณธ๊ฐ ์ถ์ฒ ๊ฐ
shared_buffers | PostgreSQL์ด ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ | 128MB | RAM์ 25~40% |
work_mem | ์ ๋ ฌ ๋ฐ ํด์ ์กฐ์ธ์ ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ | 4MB | 16MB ์ด์ |
maintenance_work_mem | ์ธ๋ฑ์ค ์์ฑ ๋ฐ VACUUM์ ์ฌ์ฉ | 64MB | 256MB ์ด์ |
shared_buffers = 4GB
work_mem = 32MB
maintenance_work_mem = 512MB
โ ์๋ฒ์ RAM ์ฉ๋์ ๋ฐ๋ผ ์ ์ ํ ์กฐ์
3.3.5 ์๋ ๊ด๋ฆฌ: AUTOVACUUM ์ค์
PostgreSQL์ MVCC(Multi-Version Concurrency Control) ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ฏ๋ก,
๋ถํ์ํ ๋ฐ์ดํฐ ์ ๋ฆฌ๋ฅผ ์ํด VACUUM์ด ํ์์ ์
๋๋ค.
๐น AUTOVACUUM ํ์ฑํ ํ์ธ
SHOW autovacuum;
โ ๊ธฐ๋ณธ์ ์ผ๋ก on ์ํ์ฌ์ผ ํจ
๐น AUTOVACUUM ์ค์ ์ต์ ํ (postgresql.conf)
autovacuum = on
autovacuum_vacuum_scale_factor = 0.1 # ๊ธฐ๋ณธ๊ฐ 0.2 → ๋ฎ์ถ๋ฉด ์์ฃผ ์คํ๋จ
autovacuum_analyze_scale_factor = 0.05
autovacuum_vacuum_cost_limit = 2000
โ ํ ์ด๋ธ ํฌ๊ธฐ์ ๋ฐ๋ผ ์ ์ ํ ๊ฐ์ผ๋ก ์กฐ์
๐ก ํ ์ด๋ธ ํฌ๊ธฐ๊ฐ ํฌ๋ค๋ฉด autovacuum์ ์กฐ์ ํ์ฌ ์ฑ๋ฅ ์ ํ ๋ฐฉ์ง
3.3.6 ์ค์๊ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง (pg_stat_statements)
PostgreSQL์์๋ SQL ์คํ ๋น๋ ๋ฐ ์ฑ๋ฅ์ ๋ถ์ํ ์ ์๋๋ก pg_stat_statements ํ์ฅ์ ์ ๊ณตํฉ๋๋ค.
๐น pg_stat_statements ํ์ฑํ
CREATE EXTENSION pg_stat_statements;
โ PostgreSQL์ ์ฟผ๋ฆฌ ํต๊ณ๋ฅผ ๊ธฐ๋กํ๋ ํ์ฅ ๊ธฐ๋ฅ ํ์ฑํ
๐น ๊ฐ์ฅ ์คํ ์๊ฐ์ด ๊ธด ์ฟผ๋ฆฌ ํ์ธ
SELECT query, calls, total_time
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 5;
โ ๊ฐ์ฅ ๋๋ฆฐ ์ฟผ๋ฆฌ๋ฅผ ์ฐพ์ ์ต์ ํ ๊ฐ๋ฅ
3.3.7 PostgreSQL ๋ชจ๋ํฐ๋ง ๋๊ตฌ ํ์ฉ
์ด์ ํ๊ฒฝ์์๋ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฅ๊ธฐ์ ์ธ ์ฑ๋ฅ ๋ถ์์ด ํ์ํฉ๋๋ค.
โ ์ถ์ฒ PostgreSQL ๋ชจ๋ํฐ๋ง ๋๊ตฌ
๋๊ตฌ ์ค๋ช
pgAdmin | PostgreSQL ๊ณต์ GUI ๊ด๋ฆฌ ๋๊ตฌ |
pg_stat_statements | SQL ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ํ์ฅ ๋ชจ๋ |
pgBadger | PostgreSQL ๋ก๊ทธ๋ฅผ ์๊ฐํํ์ฌ ๋ถ์ |
Prometheus + Grafana | ์ค์๊ฐ PostgreSQL ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง |
๐ก ์ด์ ํ๊ฒฝ์์๋ Prometheus + Grafana๋ฅผ ํ์ฉํ์ฌ ์ค์๊ฐ ๋ชจ๋ํฐ๋ง์ ๊ตฌ์ถํ ๊ฒ์ ์ถ์ฒ
3.3.8 ์ฑ๋ฅ ์ต์ ํ ์ฒดํฌ๋ฆฌ์คํธ
PostgreSQL ์ฑ๋ฅ์ ์ ์งํ๊ธฐ ์ํด ์ฃผ๊ธฐ์ ์ธ ์ ๊ฒ์ด ํ์์ ์ ๋๋ค.
โ
EXPLAIN ANALYZE๋ก ์ฟผ๋ฆฌ ์คํ ๊ณํ ํ์ธ
โ
์ ์ ํ ์ธ๋ฑ์ค(B-TREE, GIN, BRIN) ์ฌ์ฉ
โ
postgresql.conf์์ ๋ฉ๋ชจ๋ฆฌ ์ค์ ์ต์ ํ
โ
AUTOVACUUM์ ์กฐ์ ํ์ฌ ๋ถํ์ํ ๋ฐ์ดํฐ ์ ๋ฆฌ
โ
pg_stat_statements ํ์ฑํํ์ฌ SQL ์ฑ๋ฅ ๋ถ์
โ
Prometheus + Grafana๋ฅผ ํ์ฉํ์ฌ ์ค์๊ฐ ๋ชจ๋ํฐ๋ง ๊ตฌ์ถ
3.3.9 ๊ฒฐ๋ก : PostgreSQL ์ฑ๋ฅ ์ต์ ํ ํต์ฌ ์์ฝ
โ
์ฟผ๋ฆฌ ์ต์ ํ: EXPLAIN ANALYZE๋ก ์คํ ๊ณํ ํ์ธ
โ
์ธ๋ฑ์ค ์ต์ ํ: ๊ฒ์ ์ฑ๋ฅ ํฅ์์ ์ํด ์ ์ ํ ์ธ๋ฑ์ค ํ์ฉ
โ
์๋ฒ ํ๋: postgresql.conf์์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ์บ์ ์ต์ ํ
โ
์๋ ๊ด๋ฆฌ(AUTOVACUUM): ์ ๊ธฐ์ ์ธ ํ
์ด๋ธ ์ ๋ฆฌ๋ก ์ฑ๋ฅ ์ ์ง
โ
์ค์๊ฐ ๋ชจ๋ํฐ๋ง: pg_stat_statements, pgBadger, Grafana ํ์ฉ
์ด์ PostgreSQL์ ์ฑ๋ฅ ์ต์ ํ ๋ฐ ๋ชจ๋ํฐ๋ง ๊ธฐ๋ฒ์ ์ตํ์ต๋๋ค!
๋ค์ ๊ธ์์๋ PostgreSQL ๊ณ ๊ธ ๊ธฐ๋ฅ ๋ฐ ํ์ฅ ๋ชจ๋ ํ์ฉ์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค. ๐
๐ ๋ค์ ๊ธ ์๊ณ : PostgreSQL ๊ณ ๊ธ ๊ธฐ๋ฅ ๋ฐ ํ์ฅ ๋ชจ๋ ํ์ฉ
๐ ๋ค์ ํธ: 4.1 PostgreSQL ๊ณ ๊ธ ๊ธฐ๋ฅ ๋ฐ ํ์ฅ ๋ชจ๋
์ด์ PostgreSQL์ ์ฑ๋ฅ ์ต์ ํ ๋ฐ ๋ชจ๋ํฐ๋ง์ ๋ํ ๊ธ์ด ์์ฑ๋์์ต๋๋ค!
๋ค์ ๊ธ์์๋ PostgreSQL ๊ณ ๊ธ ๊ธฐ๋ฅ ๋ฐ ํ์ฅ ๋ชจ๋ ํ์ฉ์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค. ๐๐
'study > postgresql' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- ์น๊ฐ๋ฐ
- ๋ฆฌ์กํธ
- ๋ฐฑ์๋๊ฐ๋ฐ
- REACT
- ๋ก์ปฌLLM
- nextJS
- fastapi
- ํ์ด์ง
- Webpack
- rag
- ์ฑ๋ด๊ฐ๋ฐ
- til
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
- Docker
- llm
- ๋ฐฑ์๋
- Page
- github
- nodejs
- ๊ด๋ฆฌ์
- kotlin
- PostgreSQL
- Ktor
- Python
- Project
- Next.js
- AI์ฑ๋ด
- LangChain
- babel
- ํ๋ก ํธ์๋
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |