Hamutaro - Hamtaro 4

Database/Engineering

[DE] OLTP vs OLAP

carsumin 2026. 5. 19. 14:51
์™œ ๋ถ„์„์šฉ DB๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜์ง€?

 

์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์ด ๋ฐ”๋กœ OLTP์™€ OLAP์˜ ์ฐจ์ด๋‹ค.

 

OLTP - ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ DB
  • OLTP(Online Transaction Processing)๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” DB
  • MySQL, PostgreSQL
* ๋Œ€ํ‘œ์ ์ธ OLTP ์งˆ๋ฌธ๋“ค
- ์ฃผ๋ฌธ #1234์˜ ํ˜„์žฌ ์ƒํƒœ๋Š”?
- ๊น€์ฒ ์ˆ˜์˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ƒํ’ˆ ์ถ”๊ฐ€
  • ํ–‰(Row) ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ด๋‹ค.
  • ์ •๊ทœํ™”๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ๋‹ค.
  • ์†Œ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ์‹ค์‹œ๊ฐ„ ์ฝ๊ธฐ/์“ฐ๊ธฐ๊ฐ€ ๋งŽ๋‹ค.

 

OLAP - ๋ถ„์„์„ ์œ„ํ•œ DB
  • OLAP(Online Analytical Processing)๋Š” ๋ถ„์„ ์ „์šฉ DB
  • BigQuery, Snowflake, Redshift
* ๋Œ€ํ‘œ์ ์ธ OLAP ์งˆ๋ฌธ๋“ค
- ์ง€๋‚œ 3๊ฐœ์›” ์ง€์—ญ๋ณ„ ๋งค์ถœ ํ•ฉ๊ณ„
- ์ƒํ’ˆ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์žฌ๊ตฌ๋งค์œจ
- ์š”์ผ๋ณ„ ํ‰๊ท  ์ฃผ๋ฌธ ๊ธˆ์•ก ์ถ”์ด
  • ์—ด(Column) ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค.
  • ๋น„์ •๊ทœํ™” ๋˜์–ด ์žˆ๋‹ค.
  • ์ˆ˜๋ฐฑ๋งŒ~์ˆ˜์–ต ๊ฑด์„ ํ•œ ๋ฒˆ์— ์ง‘๊ณ„ํ•œ๋‹ค.
  • ์ฃผ๋กœ ๋ฐฐ์น˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์žฌํ•œ๋‹ค.

 

์™œ ๋‘˜์„ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋‚˜
  • ์šด์˜ DB์—์„œ ์ง์ ‘ ๋ถ„์„ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?
-- ์šด์˜ DB์—์„œ ์ด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํ…Œ์ด๋ธ” ํ’€์Šค์บ”์ด ๋ฐœ์ƒ
SELECT region, SUM(amount)
FROM orders
JOIN customers ON orders.customer_id = customers.id
JOIN products ON orders.product_id = products.id
WHERE created_at >= '2024-01-01'
GROUP BY region;
  • ์ˆ˜๋ฐฑ๋งŒ ๊ฑด์˜ ์ฃผ๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋ถ€ ์ฝ์œผ๋ฉด์„œ DB์— ์—„์ฒญ๋‚œ ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ์„œ๋น„์Šค ์‘๋‹ต์ด ๋А๋ ค์ง€๊ฑฐ๋‚˜ ์ตœ์•…์˜ ๊ฒฝ์šฐ ์žฅ์• ๋กœ ์ด์–ด์ง„๋‹ค.

 

์ปฌ๋Ÿผ ๊ธฐ๋ฐ˜ ์ €์žฅ์ด ๋ถ„์„์— ์œ ๋ฆฌํ•œ ์ด์œ 
  • OLAP DB๊ฐ€ ๋ถ„์„์— ๋น ๋ฅธ ํ•ต์‹ฌ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ์ปฌ๋Ÿผ ๊ธฐ๋ฐ˜ ์ €์žฅ ๋ฐฉ์‹์ด๋‹ค.
ํ–‰ ๊ธฐ๋ฐ˜ (OLTP)
โ”Œโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ id โ”‚ name โ”‚ amount โ”‚ created_at โ”‚  ← ํ–‰ ์ „์ฒด๋ฅผ ๊ฐ™์ด ์ €์žฅ
โ”œโ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  1 โ”‚ ๊น€์ฒ ์ˆ˜โ”‚  50000 โ”‚ 2024-01-01 โ”‚
โ”‚  2 โ”‚ ์ด์˜ํฌโ”‚  30000 โ”‚ 2024-01-02 โ”‚
โ”‚  3 โ”‚ ๋ฐ•๋ฏผ์ˆ˜โ”‚  80000 โ”‚ 2024-01-03 โ”‚
โ””โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

์ปฌ๋Ÿผ ๊ธฐ๋ฐ˜ (OLAP)
[id]          → 1, 2, 3, ...
[name]        → ๊น€์ฒ ์ˆ˜, ์ด์˜ํฌ, ๋ฐ•๋ฏผ์ˆ˜, ...
[amount]      → 50000, 30000, 80000, ...  ← amount๋งŒ ์ฝ์œผ๋ฉด ๋จ
[created_at]  → 2024-01-01, ...
  • SUM(amount)๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ํ–‰ ๊ธฐ๋ฐ˜์€ ๋ชจ๋“  ํ–‰์„ ์ฝ์–ด์•ผ ํ•˜์ง€๋งŒ, ์ปฌ๋Ÿผ ๊ธฐ๋ฐ˜์€ amount ์—ด๋งŒ ์ฝ์œผ๋ฉด ๋œ๋‹ค.

 

๋ฐ์ดํ„ฐ๊ฐ€ ํ๋ฅด๋Š” ๋ฐฉํ–ฅ
  • ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋ง ํ•ต์‹ฌ ํ๋ฆ„
[OLTP: MySQL / PostgreSQL]
        ↓
   ETL ํŒŒ์ดํ”„๋ผ์ธ (Airflow)   ← ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋งŒ๋“œ๋Š” ๊ตฌ๊ฐ„
        ↓
[OLAP: BigQuery / Snowflake]
        ↓
[๋Œ€์‹œ๋ณด๋“œ: Tableau / Looker]
  • OLTP์—์„œ OLAP์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” ๊ตฌ๊ฐ„
  • ์„œ๋น„์Šค DB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„์— ์ ํ•ฉํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์›จ์–ดํ•˜์šฐ์Šค์— ์ ์žฌํ•˜๋Š” ๊ฒƒ