C.W.K.
Stream
Lesson 07 of 10 · published

OLTP vs OLAP

~12 min · foundations, workload

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

금전출납기랑 회계사

식당에 데이터 직무가 두 개 있는데 안 닮아 보여. 금전출납기는 하루 종일 개별 주문 처리 — 빠르고 작고 빈번. 이게 OLTP (Online Transaction Processing). 회계사는 뒷방에 앉아서 지난달 영수증 분석해서 트렌드 찾기 — 느리고 크고 드물게. 이게 OLAP (Online Analytical Processing).

다른 모양, 다른 최적화

OLTPOLAP
동시 유저 많음analyst 적음
짧은 쿼리 (ms)긴 쿼리 (초~분)
read + write 섞임거의 read
현재 데이터과거 데이터
row 지향 storagecolumn 지향 storage
예: 주문 넣기예: 분기별 지역별 매출

Postgres 가 사는 곳

Postgres 는 OLTP 우선이고 거기 우수해. 중간 OLAP 도 처리 — 수백만 ~ 저-억 row — window function, materialised view, parallel query, JIT 으로. 진짜 웨어하우스 스케일 분석 (수십억 row 스캔) 은 Postgres 데이터를 columnar 엔진 (ClickHouse, Snowflake, BigQuery) 으로 복제하거나, Postgres 안에서 Citus extension 으로 column store + 샤딩.

Code

OLTP: 작고 인덱스 lookup·sql
SELECT id, status, total
FROM   orders
WHERE  id = 98712;
-- PK 인덱스 hit, 1ms 미만.
OLAP: 1년치 집계·sql
SELECT region,
       EXTRACT(QUARTER FROM order_date) AS quarter,
       SUM(total)                       AS revenue,
       COUNT(*)                         AS orders
FROM   orders
WHERE  order_date >= DATE_TRUNC('year', CURRENT_DATE - INTERVAL '1 year')
GROUP  BY 1, 2
ORDER  BY 1, 2;
-- row 많이 스캔; parallel worker + covering index 효과 큼.
Materialised view: 미리 계산된 분석·sql
CREATE MATERIALIZED VIEW monthly_revenue AS
SELECT DATE_TRUNC('month', order_date) AS month,
       region,
       SUM(total) AS revenue
FROM   orders
GROUP  BY 1, 2;

-- 스케줄로 새로고침; view 에 대한 쿼리는 즉시.
REFRESH MATERIALIZED VIEW CONCURRENTLY monthly_revenue;

External links

Exercise

현재 프로젝트 (혹은 작업한 거 아무거나) 에서 OLTP 모양 쿼리 하나, OLAP 모양 쿼리 하나 찾아. 각각 10× 빠르게 만들려면 뭐 바꾸겠는지 — 스키마, 인덱스, materialised view, 그냥 두기 — 적어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.