0Pricing
SQL Academy · 강의

OLTP와 OLAP 비교

트랜잭션 데이터베이스와 분석 데이터베이스를 비교합니다

OLTP와 OLAP 비교은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

OLTP와 OLAP란 무엇인가요?

데이터베이스가 모든 상황에 똑같이 적합한 것은 아닙니다. 서로 근본적으로 다른 두 작업 부하가 데이터베이스를 설계하고 운영하는 방식을 만들어 왔습니다. 바로 OLTP(온라인 트랜잭션 처리)와 OLAP(온라인 분석 처리)입니다.

이 차이를 이해하는 것은 모든 데이터 전문가에게 필수적입니다. OLTP와 OLAP 중 올바른 선택이 질의 속도, 저장 비용, 데이터 시스템의 전체 아키텍처를 결정합니다.

OLTP: 트랜잭션용으로 설계됨

OLTP 시스템은 실시간 비즈니스 이벤트를 반영하는 삽입, 업데이트, 삭제와 같은 짧고 빠른 작업을 대량으로 처리합니다. 주문하기, 결제 처리, 고객 레코드 업데이트 등이 그 예입니다.

OLTP의 핵심 특성은 작업별 낮은 지연 시간, 높은 동시성, 강한 일관성입니다. 데이터 무결성을 보호하려면 모든 트랜잭션이 ACID를 준수해야 합니다.

-- OLTP example: inserting a new order
INSERT INTO orders (customer_id, product_id, quantity, order_date)
VALUES (1042, 88, 3, CURRENT_DATE);

-- Immediately update inventory
UPDATE inventory
SET stock = stock - 3
WHERE product_id = 88;

OLAP: 분석용으로 설계됨

OLAP 시스템은 대량의 과거 데이터를 검색하여 추세, 패턴, 요약 정보를 찾아내는 복잡한 질의에 맞게 최적화되어 있습니다. 비즈니스 분석가와 데이터 과학자는 OLAP를 사용하여 다음과 같은 질문에 답합니다. '지난 분기 지역별 총매출은 얼마였는가?'

OLAP 질의는 수백만 개의 행을 집계하고 팩트 테이블과 차원 테이블을 가로지르는 여러 조인을 포함하는 경우가 많습니다. 개별 쓰기 속도는 부차적이며, 읽기 처리량과 질의 유연성이 중요합니다.

-- OLAP example: total sales by region for Q1 2024
SELECT
    d.region,
    SUM(f.sales_amount) AS total_sales,
    COUNT(f.order_id)   AS order_count
FROM fact_sales f
JOIN dim_date   dd ON f.date_key   = dd.date_key
JOIN dim_store  d  ON f.store_key  = d.store_key
WHERE dd.year = 2024
  AND dd.quarter = 1
GROUP BY d.region
ORDER BY total_sales DESC;

두 시스템 나란히 비교하기

두 시스템의 차이를 기억하는 가장 쉬운 방법은 각각 누가 사용하고 어떻게 사용하는지 생각해 보는 것입니다.

  • OLTP: 응용 프로그램의 서버 측에서 사용하며, 수천 명의 사용자가 동시에 이용하고, 각 질의는 소수의 행에 접근합니다.
  • OLAP: 분석가와 보고 도구에서 사용하며, 동시에 실행되는 질의는 더 적지만 각 질의가 수백만 개의 행을 검색합니다.

이처럼 서로 다른 접근 패턴으로 인해 스키마 설계, 인덱스 전략, 심지어 하드웨어 선택까지 크게 달라집니다.

-- OLTP: lookup a single customer's latest order (row-level access)
SELECT o.order_id, o.order_date, o.total_amount
FROM orders o
WHERE o.customer_id = 1042
ORDER BY o.order_date DESC
LIMIT 1;

-- OLAP: monthly revenue trend over the past year (aggregate scan)
SELECT
    DATE_TRUNC('month', order_date) AS month,
    SUM(total_amount)               AS revenue
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY 1
ORDER BY 1;

스키마 설계: 정규화와 비정규화

OLTP 데이터베이스는 중복을 제거하고 쓰기 작업을 효율적으로 수행하기 위해 정규화된 스키마(3NF 이상)를 선호합니다. 각 엔터티는 자체 테이블에 저장되므로 트랜잭션마다 영향을 받는 데이터가 줄어듭니다.

OLAP 데이터베이스는 비정규화된 스키마를 선호합니다. 특히 스타 스키마와 스노플레이크 스키마에서는 데이터를 미리 조인하고 중복을 허용합니다. 이렇게 하면 쿼리 실행 시 비용이 많이 드는 조인을 수행하지 않아도 되며, 컬럼형 저장 엔진이 데이터를 더 빠르게 스캔할 수 있습니다.

-- Normalized OLTP design (3NF)
CREATE TABLE customers (
    customer_id SERIAL PRIMARY KEY,
    name        VARCHAR(100),
    email       VARCHAR(150) UNIQUE
);

CREATE TABLE orders (
    order_id    SERIAL PRIMARY KEY,
    customer_id INT REFERENCES customers(customer_id),
    order_date  DATE,
    total       NUMERIC(10,2)
);

-- Denormalized OLAP fact table (star schema)
CREATE TABLE fact_sales (
    sale_id      BIGINT PRIMARY KEY,
    customer_key INT,
    date_key     INT,
    product_key  INT,
    region       VARCHAR(50),
    category     VARCHAR(50),
    amount       NUMERIC(12,2)
);

인덱싱 전략의 차이

OLTP 시스템은 트랜잭션 내에서 빠른 단일 행 조회와 효율적인 조인을 수행할 수 있도록 기본 키와 외래 키에 대한 B-트리 인덱스에 크게 의존합니다.

OLAP 시스템에서는 비트맵 인덱스, 컬럼형 저장, 파티셔닝이 유용합니다. 전체 열(예: 모든 판매 금액)을 스캔할 때는 데이터를 행별로 저장하는 것보다 열별로 저장하는 편이 훨씬 효율적입니다.

-- OLTP: B-tree index for fast order lookup by customer
CREATE INDEX idx_orders_customer
    ON orders (customer_id);

-- OLTP: compound index for range queries
CREATE INDEX idx_orders_date_customer
    ON orders (order_date, customer_id);

-- OLAP: partition fact table by year to prune scan
CREATE TABLE fact_sales_2024
    PARTITION OF fact_sales
    FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');

동시성 및 잠금

OLTP 시스템은 충돌 없이 수천 건의 동시 쓰기 작업을 처리해야 합니다. 데이터베이스는 행 수준 잠금과 MVCC(다중 버전 동시성 제어)를 사용하므로 읽기 작업이 쓰기 작업을 차단하지 않고, 그 반대도 성립합니다.

OLAP 쿼리는 대부분 읽기 전용입니다. 잠금은 거의 문제가 되지 않지만, 장시간 실행되는 스캔은 상당한 CPU와 입출력 리소스를 사용할 수 있습니다. 대부분의 데이터 웨어하우스는 OLTP 원본에서 일괄 ETL 또는 CDC(변경 데이터 캡처)로 데이터를 공급받는 별도의 시스템에서 OLAP을 실행합니다.

-- OLTP: explicit transaction with row-level lock
BEGIN;

SELECT balance
FROM accounts
WHERE account_id = 7
FOR UPDATE;

UPDATE accounts
SET balance = balance - 200
WHERE account_id = 7;

COMMIT;

ETL: OLTP와 OLAP 연결하기

OLTP와 OLAP은 설계가 서로 호환되지 않으므로, 조직에서는 ETL(추출, 변환, 적재) 파이프라인을 실행하여 트랜잭션 데이터베이스의 데이터를 분석용 웨어하우스로 복사하고 형태를 바꿉니다. 이 작업은 일정에 따라(매일 밤, 매시간 또는 거의 실시간으로) 수행됩니다.

ETL 프로세스는 정규화된 OLTP 행을 비정규화된 팩트 및 차원 레코드로 변환하고, 그 과정에서 비즈니스 로직(예: 통화 변환, 고객 세분화)을 적용합니다.

-- Simplified ETL INSERT from OLTP orders into OLAP fact table
INSERT INTO fact_sales (
    customer_key,
    date_key,
    product_key,
    amount
)
SELECT
    dc.customer_key,
    dd.date_key,
    dp.product_key,
    o.total_amount
FROM orders o
JOIN dim_customer dc ON dc.source_customer_id = o.customer_id
JOIN dim_date     dd ON dd.calendar_date       = o.order_date
JOIN dim_product  dp ON dp.source_product_id   = o.product_id
WHERE o.order_date = CURRENT_DATE - INTERVAL '1 day'
  AND o.order_id NOT IN (SELECT source_order_id FROM fact_sales);

일반적인 OLAP 쿼리 패턴

OLAP 쿼리에는 거의 항상 집계(SUM, COUNT, AVG), 여러 차원에 걸친 그룹화, 날짜 범위나 범주에 따른 필터링이 포함됩니다. 이러한 요소는 대시보드와 비즈니스 보고서를 구성하는 기본 요소입니다.

윈도 함수는 OLAP 작업에서 특히 강력합니다. 셀프 조인 없이 각 기간의 수치를 이전 기간과 비교할 수 있게 해 주기 때문입니다.

-- Year-over-year revenue comparison using a window function
SELECT
    dd.year,
    dd.quarter,
    SUM(f.amount)                                          AS revenue,
    LAG(SUM(f.amount)) OVER (PARTITION BY dd.quarter
                             ORDER BY dd.year)             AS prev_year_revenue,
    ROUND(
        100.0 * (SUM(f.amount) -
                 LAG(SUM(f.amount)) OVER (PARTITION BY dd.quarter
                                         ORDER BY dd.year))
        / NULLIF(LAG(SUM(f.amount)) OVER (PARTITION BY dd.quarter
                                          ORDER BY dd.year), 0)
    , 2)                                                   AS yoy_pct_change
FROM fact_sales f
JOIN dim_date dd ON f.date_key = dd.date_key
GROUP BY dd.year, dd.quarter
ORDER BY dd.quarter, dd.year;

HTAP: 경계 흐리기

TiDB, SingleStore, PostgreSQL + 컬럼형 확장 기능과 같은 최신 시스템은 HTAP(하이브리드 트랜잭션/분석 처리)를 구현합니다. 이러한 시스템은 하나의 엔진에서 두 작업을 모두 처리하여 OLTP 시스템과 OLAP 시스템을 별도로 유지해야 하는 운영 복잡성을 줄이는 것을 목표로 합니다.

HTAP은 데이터를 두 가지 형식으로 동시에 저장하여 이를 달성합니다. 트랜잭션 쓰기에는 행 저장소를 사용하고 분석 읽기에는 컬럼 저장소를 사용하며, 두 저장소의 데이터는 자동으로 동기화됩니다.

-- PostgreSQL with cstore_fdw (columnar extension) example
-- Analytical table stored in columnar format
CREATE FOREIGN TABLE fact_sales_columnar (
    date_key     INT,
    product_key  INT,
    region       VARCHAR(50),
    amount       NUMERIC(12,2)
)
SERVER cstore_server
OPTIONS (filename '/data/fact_sales_columnar');

-- Regular OLTP table remains row-based
-- Both can be queried in the same SQL statement
SELECT f.region, SUM(f.amount)
FROM fact_sales_columnar f
GROUP BY f.region;

적합한 시스템 선택하기

OLTP와 OLAP(또는 HTAP) 중 무엇을 선택할지는 주된 작업 부하에 따라 결정됩니다.

  • 실시간으로 이벤트를 기록하는 애플리케이션을 구축한다면 OLTP 데이터베이스(PostgreSQL, MySQL, SQL 서버)를 사용합니다.
  • 과거 데이터를 기반으로 보고 계층을 구축한다면 OLAP 웨어하우스(BigQuery, 레드시프트, 스노플레이크, ClickHouse)를 사용합니다.
  • 두 작업이 모두 필요하고 운영을 단순하게 유지하려면 HTAP 옵션을 검토합니다.

많은 운영 환경의 아키텍처는 OLTP 데이터베이스를 기준 시스템으로 사용하고, 분석을 위해 별도의 데이터 웨어하우스를 함께 운영하며, 두 시스템을 ETL 파이프라인으로 연결합니다.

-- Quick diagnostic: check table access pattern
-- High seq_scan relative to idx_scan = analytical (OLAP-like) load
SELECT
    relname              AS table_name,
    seq_scan,
    idx_scan,
    n_live_tup           AS live_rows
FROM pg_stat_user_tables
ORDER BY seq_scan DESC
LIMIT 10;

이해도 확인

OLTP 시스템과 OLAP 시스템의 주요 차이점을 얼마나 잘 이해했는지 확인해 보세요.

수업 요약

OLTP와 OLAP의 핵심 요점:

  • OLTP는 ACID 보장을 바탕으로 빠르고 동시성이 높은 행 수준 쓰기를 수행하는 실시간 트랜잭션 작업을 처리합니다.
  • OLAP는 비정규화된 스키마를 사용하여 대규모 과거 데이터 집합에서 복잡한 집계를 수행하는 분석 작업을 처리합니다.
  • 스키마 설계는 작업 부하를 따릅니다. OLTP에는 정규화(3NF)를, OLAP에는 스타 스키마 또는 스노플레이크 스키마를 사용합니다.
  • ETL 파이프라인은 변환된 OLTP 데이터를 분석용 웨어하우스에 적재하여 두 시스템을 연결합니다.
  • HTAP 시스템은 행 및 열 이중 저장 방식을 사용하여 하나의 엔진에서 두 작업을 모두 처리하려고 합니다.

처음부터 적합한 아키텍처를 선택하면 나중에 고통스러운 마이그레이션을 피하고, 사용자가 기대하는 속도로 쿼리가 실행되도록 할 수 있습니다.

자주 묻는 질문

“OLTP와 OLAP 비교” 강의는 무료인가요?

네 — “OLTP와 OLAP 비교” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“OLTP와 OLAP 비교”에서 뭘 배우나요?

트랜잭션 데이터베이스와 분석 데이터베이스를 비교합니다 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

SQL Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“OLTP와 OLAP 비교” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. OLTP와 OLAP 비교
  2. 팩트 테이블과 차원 테이블
  3. 스타 스키마와 스노플레이크 스키마
  4. 분석 쿼리 작성
← SQL Academy(으)로 돌아가기