ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐Ÿ“Œ 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' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๐Ÿ“Œ PostgreSQL๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ: ์ด๋ก ๊ณผ ์‹ค์Šต - PostgreSQL ์ตœ์ข… ๋งˆ๋ฌด๋ฆฌ ๋ฐ ์ถ”๊ฐ€ ํ•™์Šต ๋ฆฌ์†Œ์Šค  (0) 2025.03.10
๐Ÿ“Œ PostgreSQL๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ: ์ด๋ก ๊ณผ ์‹ค์Šต - PostgreSQL ์‹ค๋ฌด Q&A ๋ฐ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€์ด๋“œ  (0) 2025.03.10
๐Ÿ“Œ PostgreSQL๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ: ์ด๋ก ๊ณผ ์‹ค์Šต - PostgreSQL ํ™œ์šฉ์„ ์œ„ํ•œ ์‹ค์ „ ๊ฐ€์ด๋“œ  (0) 2025.03.10
๐Ÿ“Œ PostgreSQL๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ: ์ด๋ก ๊ณผ ์‹ค์Šต - PostgreSQL ์ตœ์‹  ๋™ํ–ฅ ๋ฐ ๋ฏธ๋ž˜ ์ „๋ง  (0) 2025.03.10
๐Ÿ“Œ PostgreSQL๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ: ์ด๋ก ๊ณผ ์‹ค์Šต - PostgreSQL ์šด์˜ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ์ „๋žต  (0) 2025.03.10
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
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
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•