콘텐츠로 이동

OLTP (Online Transaction Processing) vs OLAP (Online Analytical Processing)

주문 상태를 조회하는 API와 연간 매출 보고서는 같은 주문 데이터를 사용하지만, 읽는 범위와 성능 목표가 다르다.

  • OLTP: 개별 업무 트랜잭션을 처리
  • OLAP: 많은 데이터를 집계해 추세와 현황을 분석하는 방식

다음 예시는 주문당 한 행을 저장하며, 주문 금액의 통화가 같다고 가정한다.

-- OLTP: 주문 한 건의 현재 상태 조회
SELECT order_id, status, order_amount
FROM orders
WHERE order_id = 1001;
-- OLAP: 연간 주문 금액을 고객별로 집계
SELECT customer_id, SUM(order_amount) AS total_order_amount
FROM orders
WHERE ordered_at >= '2026-01-01'
AND ordered_at < '2027-01-01'
GROUP BY customer_id;

첫 쿼리는 인덱스로 필요한 주문을 찾을 수 있다. 두 번째 쿼리는 대상 기간의 주문을 읽고 고객별로 합산해야 한다.

비교 기준OLTPOLAP
주요 작업주문 생성·결제·상태 조회기간별 매출·상품별 판매량 분석
접근 범위소수 행의 조회·변경많은 행의 스캔·집계
모델의 경향갱신 이상을 줄이는 정규화집계하기 쉬운 사실·차원 모델
성능 목표짧은 응답 시간과 높은 동시 처리량대량 집계의 시간과 처리 비용

OLTP에도 읽기가 많고 OLAP에도 데이터 갱신이 있으며, 읽기·쓰기 비율이나 SQL 사용 여부로 구분하지 않는다.

SQL에서 보이는 표는 같지만, 디스크에서 어떤 값을 모아 저장하는지가 다르다.

order_idstatusorder_amountshipping_address
1001PAID10000서울
1002PAID20000부산
1003PAID15000대전

아래는 값이 묶이는 방식을 단순화한 그림으로, 실제 디스크 I/O는 행 하나가 아니라 페이지·블록 단위로 수행된다.

행 지향: 한 주문의 컬럼들을 함께 저장
[1001 | PAID | 10000 | 서울]
[1002 | PAID | 20000 | 부산]
[1003 | PAID | 15000 | 대전]
열 지향: 같은 컬럼의 값을 함께 저장
order_id [1001 | 1002 | 1003 ]
status [PAID | PAID | PAID ]
order_amount [10000 | 20000 | 15000]
shipping_address [서울 | 부산 | 대전 ]

이 차이는 조회에 필요한 값이 어디에 모여 있는지로 이어진다.

조회행 지향열 지향
주문 1001의 상태·금액·배송지인덱스로 주문 위치를 찾으면 여러 속성이 함께 있음해당 주문의 값을 각 컬럼에서 가져와 결합
전체 주문 금액 합계 SUM(order_amount)테이블 스캔 시 금액과 함께 저장된 상태·배송지도 읽음금액 컬럼의 블록만 읽어 10000 + 20000 + 15000 = 45000 계산
  • 소수 주문의 여러 속성을 다루는 API에는 행 지향이, 많은 주문의 일부 컬럼만 집계하는 분석에는 열 지향이 유리
  • 열 지향은 같은 자료형·반복 값을 모으므로 컬럼 특성에 맞춘 압축도 적용하기 쉬움

운영 DB와 분석 저장소의 분리 기준

섹션 제목: “운영 DB와 분석 저장소의 분리 기준”

운영 DB에서 넓은 범위의 집계를 실행하면 주문 API와 CPU·I/O·메모리를 함께 사용하기 때문에, 자원 경합으로 API 응답이 느려질 수 있다.

선택적용 조건감수할 비용
운영 DB의 인덱스·집계 테이블작은 통계이며 운영 요청에 미치는 영향이 작음집계 갱신 비용과 운영 자원 공유
읽기 레플리카같은 스키마로 충분하고 조회 부하 분산이 필요함복제 지연, 레플리카 자원 관리
별도 분석 저장소대량 집계, 여러 원천 통합, 과거 이력 보관이 필요함데이터 적재 지연과 파이프라인 운영 비용

마지막 업데이트:

Large-Scale System