ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ PostgreSQL๋ก ์์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ: ์ด๋ก ๊ณผ ์ค์ต - PostgreSQL ์ฌํ ์ฃผ์ ๋ฐ ์ต์ ํ ํ ๋ชจ์
octo54 2025. 3. 10. 14:49๐ PostgreSQL๋ก ์์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ: ์ด๋ก ๊ณผ ์ค์ต
6.3 PostgreSQL ์ฌํ ์ฃผ์ ๋ฐ ์ต์ ํ ํ ๋ชจ์
PostgreSQL์ ์ค๋ฌด์์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ๊ณ ๊ธ ๊ธฐ๋ฅ๊ณผ ์ฑ๋ฅ ์ต์ ํ๊ฐ ํ์ํด์ง๋๋ค.
์ด๋ฒ ๊ธ์์๋ PostgreSQL์ ์ฌํ ์ฃผ์ ์ ์ด์ ํ๊ฒฝ์์ ์ฑ๋ฅ์ ๊ทน๋ํํ๋ ์ต์ ํ ํ์ ์ ๋ฆฌํ๊ฒ ์ต๋๋ค. ๐
6.3.1 PostgreSQL ๊ณ ๊ธ ๊ธฐ๋ฅ ์ ๋ฆฌ
PostgreSQL์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ์ค๋ฌด์์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํด์ผ ํฉ๋๋ค.
๋ค์์ PostgreSQL์์ ํ์ฉํ ์ ์๋ ํต์ฌ ๊ณ ๊ธ ๊ธฐ๋ฅ์
๋๋ค.
โ PostgreSQL ์ฌํ ๊ธฐ๋ฅ ๋ฆฌ์คํธ
๊ธฐ๋ฅ ์ค๋ช
PL/pgSQL | ํธ๋ฆฌ๊ฑฐ ๋ฐ ์คํ ์ด๋ ํ๋ก์์ ํ์ฉ |
Parallel Query | ๋ณ๋ ฌ ์ฟผ๋ฆฌ ์คํ ์ต์ ํ |
Foreign Data Wrapper (FDW) | ์ธ๋ถ ๋ฐ์ดํฐ ์ฐ๋ (MySQL, MongoDB ๋ฑ) |
Logical Replication | ํ ์ด๋ธ ๋จ์ ๋ฐ์ดํฐ ๋ณต์ |
Partitioning & Sharding | ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ต์ ํ |
pg_stat_statements | SQL ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง |
pgvector | AI ๋ฒกํฐ ๊ฒ์ (Embedding ๋ฐ์ดํฐ ์ ์ฅ) |
์ด์ ๊ฐ ๊ธฐ๋ฅ๋ณ๋ก ์ค๋ฌด์์ ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
6.3.2 PL/pgSQL์ ํ์ฉํ ์๋ํ ๋ฐ ํธ๋ฆฌ๊ฑฐ
PostgreSQL์ SQL ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ธ PL/pgSQL์ ์ง์ํฉ๋๋ค.
์ด๋ฅผ ํ์ฉํ๋ฉด ํธ๋ฆฌ๊ฑฐ(Trigger) ๋ฐ ์๋ํ ๋ก์ง์ ๊ตฌํํ ์ ์์ต๋๋ค.
๐น PL/pgSQL์ ํ์ฉํ ํธ๋ฆฌ๊ฑฐ ์์
CREATE TABLE audit_logs (
id SERIAL PRIMARY KEY,
user_id INT,
action TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE FUNCTION log_user_action() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO audit_logs (user_id, action) VALUES (NEW.id, 'User Created');
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER user_insert_trigger
AFTER INSERT ON users
FOR EACH ROW EXECUTE FUNCTION log_user_action();
โ ์๋ก์ด ์ฌ์ฉ์๊ฐ ์์ฑ๋ ๋ ์๋์ผ๋ก ๋ก๊ทธ ๊ธฐ๋ก
๐ก ์ด ๋ฐฉ์์ ๊ฐ์ฌ๋ฅผ ์ํ ๋ก๊น , ์๋ ๋ฐ์ดํฐ ์ ๋ฆฌ ๋ฑ์ ์ ์ฉํ๊ฒ ํ์ฉ ๊ฐ๋ฅ
6.3.3 ๋ณ๋ ฌ ์ฟผ๋ฆฌ ์ต์ ํ (Parallel Query)
PostgreSQL์ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฟผ๋ฆฌ๋ฅผ ๋ณ๋ ฌ๋ก ์คํํ์ฌ ์ฑ๋ฅ์ ํฅ์ํ ์ ์์ต๋๋ค.
โ ๋ณ๋ ฌ ์ฟผ๋ฆฌ๊ฐ ํ์ํ ์ํฉ
๐น ๋์ฉ๋ ๋ฐ์ดํฐ ์กฐํ (SELECT COUNT(*) ๋ฑ)
๐น ์ง๊ณ ํจ์(SUM(), AVG(), MAX() ๋ฑ) ์ฌ์ฉ
๐น ๋ํ ํ
์ด๋ธ์์ JOIN ์ฐ์ฐ ์ํ
๐น ๋ณ๋ ฌ ์ฟผ๋ฆฌ ์คํ ํ์ธ (EXPLAIN ANALYZE)
EXPLAIN ANALYZE SELECT COUNT(*) FROM sales;
โ ์คํ ๊ณํ์์ Parallel Seq Scan์ด ํ์๋๋ฉด ๋ณ๋ ฌ ์ฒ๋ฆฌ ํ์ฑํ
๐น ๋ณ๋ ฌ ์ฒ๋ฆฌ ํ์ฑํ (postgresql.conf ์ค์ ์กฐ์ )
max_parallel_workers_per_gather = 4
parallel_tuple_cost = 0.1
โ ์ฟผ๋ฆฌ ๋ณ๋ ฌ ์คํ ๊ฐ์๋ฅผ ์ต์ ํํ์ฌ ์ฑ๋ฅ ํฅ์ ๊ฐ๋ฅ
6.3.4 Foreign Data Wrapper (FDW)๋ฅผ ํ์ฉํ ์ธ๋ถ ๋ฐ์ดํฐ ์ฐ๋
PostgreSQL์ FDW(Foreign Data Wrapper) ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด
๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค(MySQL, MongoDB, CSV ํ์ผ ๋ฑ)์ ์ง์ ์ฐ๋ํ ์ ์์ต๋๋ค.
๐น MySQL ์ฐ๋ ์์ (mysql_fdw)
CREATE EXTENSION mysql_fdw;
CREATE SERVER mysql_server FOREIGN DATA WRAPPER mysql_fdw
OPTIONS (host '127.0.0.1', port '3306');
CREATE FOREIGN TABLE mysql_users (
id INT,
name TEXT
) SERVER mysql_server OPTIONS (database 'mydb', table 'users');
SELECT * FROM mysql_users;
โ PostgreSQL์์ MySQL ๋ฐ์ดํฐ๋ฅผ ์ง์ ์กฐํ ๊ฐ๋ฅ
๐ก ์ด ๋ฐฉ์์ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํตํฉํ ๋ ๋งค์ฐ ์ ์ฉํจ
6.3.5 ๋ ผ๋ฆฌ์ ๋ณต์ (Logical Replication)๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ ๋๊ธฐํ
PostgreSQL์ Logical Replication(๋
ผ๋ฆฌ์ ๋ณต์ ) ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด
ํน์ ํ
์ด๋ธ๋ง ์ ํ์ ์ผ๋ก ๋ณต์ ํ ์ ์์ต๋๋ค.
๐น ๋ ผ๋ฆฌ์ ๋ณต์ ์ค์
1๏ธโฃ ๋ฐํ(Publisher) ์๋ฒ์์ ๋ณต์ ์์ฑ
CREATE PUBLICATION my_pub FOR TABLE users;
2๏ธโฃ ๊ตฌ๋ (Subscriber) ์๋ฒ์์ ๋ณต์ ์์
CREATE SUBSCRIPTION my_sub CONNECTION 'host=192.168.1.100 dbname=source_db user=replicator password=secret'
PUBLICATION my_pub;
โ ์ด์ ํ๊ฒฝ์์ ์ผ๋ถ ํ ์ด๋ธ๋ง ๋๊ธฐํํ ๋ ์ ์ฉ
๐ก Master-Slave ๋ณต์ ๋ณด๋ค ๋ ์ธ๋ฐํ ์ ์ด๊ฐ ๊ฐ๋ฅํ์ฌ ๋ง์ดํฌ๋ก์๋น์ค ํ๊ฒฝ์ ์ ํฉ
6.3.6 ๋์ฉ๋ ๋ฐ์ดํฐ ์ต์ ํ (Partitioning & Sharding)
๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ํํฐ์
๋(Partitioning)๊ณผ ์ค๋ฉ(Sharding)์ ํ์ฉํ๋ฉด
๋ฐ์ดํฐ ์กฐํ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์ํ ์ ์์ต๋๋ค.
๐น ํ ์ด๋ธ ํํฐ์ ๋ ์์ (RANGE PARTITIONING)
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
sale_date DATE NOT NULL,
amount NUMERIC NOT NULL
) PARTITION BY RANGE (sale_date);
CREATE TABLE sales_2023 PARTITION OF sales FOR VALUES FROM ('2023-01-01') TO ('2023-12-31');
CREATE TABLE sales_2024 PARTITION OF sales FOR VALUES FROM ('2024-01-01') TO ('2024-12-31');
โ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋๋ณ๋ก ๋ถํ ํ์ฌ ์กฐํ ์ฑ๋ฅ ํฅ์
๐ก Citus ํ์ฅ ๋ชจ๋์ ํ์ฉํ๋ฉด PostgreSQL์ ๋ถ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ํ์ฅ ๊ฐ๋ฅ
6.3.7 PostgreSQL ์ฑ๋ฅ ์ต์ ํ ํ ๋ชจ์
PostgreSQL ์ฑ๋ฅ์ ๊ทน๋ํํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ต์ ํ ํ์ ํ์ฉํ์ธ์.
โ PostgreSQL ์ฑ๋ฅ ์ต์ ํ ์ฒดํฌ๋ฆฌ์คํธ
1๏ธโฃ SQL ํ๋ (EXPLAIN ANALYZE ํ์ ์ฌ์ฉ)
2๏ธโฃ ์ธ๋ฑ์ค ์ต์ ํ (B-TREE, GIN, BRIN ํ์ฉ)
3๏ธโฃ VACUUM ๋ฐ AUTOVACUUM ํ์ฑํํ์ฌ ํ
์ด๋ธ ์ ๋ฆฌ
4๏ธโฃ pg_stat_statements๋ฅผ ํ์ฉํ์ฌ ๊ฐ์ฅ ๋๋ฆฐ ์ฟผ๋ฆฌ ๋ถ์
5๏ธโฃ parallel_tuple_cost ๋ฐ max_parallel_workers_per_gather ์กฐ์ ํ์ฌ ๋ณ๋ ฌ ์ฟผ๋ฆฌ ํ์ฑํ
6๏ธโฃ ์ธ๋ถ ๋ฐ์ดํฐ ์ฐ๋(FDW)์ ํตํด MySQL, MongoDB ๋ฑ์ ๋ฐ์ดํฐ๋ฅผ ํตํฉ
7๏ธโฃ ํํฐ์
๋์ ์ ์ฉํ์ฌ ๋๋ ๋ฐ์ดํฐ ๊ด๋ฆฌ ์ต์ ํ
8๏ธโฃ ๋
ผ๋ฆฌ์ ๋ณต์ (Logical Replication)๋ฅผ ํตํด ๋ถ๋ถ์ ์ธ ๋ฐ์ดํฐ ๋๊ธฐํ ๊ตฌํ
๐ก ์ด์ ํ๊ฒฝ์์๋ ์ ์ค์ ์ ์ ์ ํ ์กฐ์ ํ์ฌ PostgreSQL ์ฑ๋ฅ์ ๊ทน๋ํํ ์ ์์
6.3.8 ๊ฒฐ๋ก : PostgreSQL ์ฌํ ๊ธฐ๋ฅ ๋ฐ ์ต์ ํ ์ ๋ต ์์ฝ
โ
PL/pgSQL์ ํ์ฉํ์ฌ ํธ๋ฆฌ๊ฑฐ ๋ฐ ์๋ํ ๊ตฌํ
โ
๋ณ๋ ฌ ์ฟผ๋ฆฌ ์คํ(Parallel Query)์ ํตํด ๋์ฉ๋ ๋ฐ์ดํฐ ์ฑ๋ฅ ์ต์ ํ
โ
FDW๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค(MySQL, MongoDB ๋ฑ) ์ฐ๋
โ
Logical Replication์ผ๋ก ํน์ ํ
์ด๋ธ๋ง ๋ณต์ ๊ฐ๋ฅ
โ
Partitioning๊ณผ Sharding์ ํ์ฉํ์ฌ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ต์ ํ
โ
PostgreSQL ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด EXPLAIN ANALYZE, VACUUM, pg_stat_statements ํ์ฉ
์ด์ PostgreSQL์ ์ฌํ ๊ธฐ๋ฅ๊ณผ ์ต์ ํ ๋ฐฉ๋ฒ๊น์ง ์ตํ์ต๋๋ค!
PostgreSQL์ ์ค๋ฌด์์ ๋์ฑ ๊ฐ๋ ฅํ๊ฒ ํ์ฉํด ๋ณด์ธ์. ๐
'study > postgresql' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- github
- fastapi
- Page
- Ktor
- Next.js
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
- Python
- REACT
- Project
- ๋ฐฑ์๋
- PostgreSQL
- llm
- AI์ฑ๋ด
- nodejs
- rag
- ๋ก์ปฌLLM
- til
- Webpack
- kotlin
- babel
- ํ์ด์ง
- ์น๊ฐ๋ฐ
- LangChain
- ๋ฆฌ์กํธ
- nextJS
- Docker
- ๊ด๋ฆฌ์
- ๋ฐฑ์๋๊ฐ๋ฐ
- ํ๋ก ํธ์๋
- ์ฑ๋ด๊ฐ๋ฐ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |