본문 바로가기
C.W.K.
Stream
Lesson 07 of 10 · published

OLTP와 OLAP

~12 min · foundations, workload

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

계산대와 회계사의 일

식당의 계산대는 하루 종일 주문을 하나씩 빠르게 처리해. 작고 짧은 일을 아주 자주 수행하는 이 모양이 OLTP, 온라인 트랜잭션 처리야. 회계사는 지난달 영수증을 한꺼번에 훑으며 매출 흐름을 찾아. 오래 걸리는 큰 분석을 드물게 수행하는 이 모양이 OLAP, 온라인 분석 처리야.

서로 다른 작업에는 다른 최적화가 필요해

OLTPOLAP
동시에 쓰는 사람이 많음분석하는 사람이 적음
짧은 질의, 보통 ms 단위긴 질의, 수 초에서 수 분
읽기와 쓰기가 섞임대부분 읽기
현재 상태가 중요함과거 흐름이 중요함
행 지향 저장열 지향 저장
예: 주문 접수예: 분기·지역별 매출

PostgreSQL이 맡을 수 있는 범위

PostgreSQL은 OLTP에 먼저 맞춰진 데이터베이스고 그 일을 아주 잘해. 수백만 행에서 1억대 초반 행을 다루는 중간 규모 OLAP도 윈도 함수, 구체화된 뷰, 병렬 질의, JIT로 감당할 수 있어. 수십억 행을 계속 훑는 웨어하우스급 분석이라면 데이터를 ClickHouse·Snowflake·BigQuery 같은 열 지향 엔진으로 복제하거나, Citus 확장 기능으로 PostgreSQL에 열 저장과 분산 처리를 더하는 쪽을 검토해.

Code

OLTP: 작은 범위를 색인으로 찾기·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 효과 큼.
구체화된 뷰로 분석 결과 미리 계산하기·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× 빠르게 만들려면 스키마, 색인, 구체화된 뷰 가운데 무엇을 바꿀지, 아니면 그대로 둘지 적어봐.

Progress

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

댓글 0

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

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