267. 데이터 분할 기법 (Fragmentation)
핵심 인사이트 (3줄 요약)
- 본질: 데이터 분할 기법은 대규모 데이터베이스의 테이블을 물리적으로 작은 단위(분할, Fragment)로 나누어 저장 관리하는 기법으로, 수평 분할(행 단위)과 수직 분할(열 단위)이 있다.
- 가치: 데이터 조회 성능 향상, 관리 편의성 증가, 장애 격리 효과, 병렬 처리 효율화 등의 장점이 있다.
- 융합: 수평 분할, 수직 분할, 복제, 분산 데이터베이스, 파티셔닝과 밀접하게 연관된다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
개념 정의
데이터 분할(Fragmentation)은 대규모 테이블을 물리적으로 작은 단위로 나누어 저장 관리하는 기법이다. 수평 분할(Horizontal Fragmentation)은 행(Tuple) 단위로, 수직 분할(Vertical Fragmentation)은 열(Attribute) 단위로 분할한다. 분할된 각 단위를.Fragment라 하며, 하나 이상의 노드에 저장될 수 있다.
필요성
대규모 데이터베이스에서 전체 테이블을 스캔하면 성능 저하가 발생한다. 또한 특정 데이터만 필요한 경우에도 전체 테이블을 읽어야 하는 overhead가 있다. 데이터 분할을 통해 필요한 분할만 접근하면 성능을 향상시킬 수 있고, 관리가 용이하며, 장애 시 영향 범위를 제한할 수 있다.
배경
데이터 분할은 1980년대 분산 데이터베이스 연구에서 비롯되었으며, 이후 Oracle, PostgreSQL, MongoDB, Cassandra 등 다양한 데이터베이스에서 구현되고 있다. 특히 대규모 데이터 처리, 분석 시스템, 분산 환경에서 필수적인 기법이다.
비유
데이터 분할은大型도서관의 분류대와 같다. 모든 책을 한 곳에 쌓아두면 찾기 어렵지만,分野별로, 알파벳순으로 나누어 두면 필요한 책을 빠르게 찾을 수 있다. 또한 특정 분야가火灾えても他の分野는影響なし。
📢 섹션 요약: 데이터 분할은 대규모 테이블을 물리적 단위로 나누어 저장 관리하는 기법으로, 성능 향상, 관리 편의성, 장애 격리 효과를 제공한다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
수평 분할 vs 수직 분할
┌─────────────────────────────────────────────────────────────────────────────┐
│ 수평 분할 vs 수직 분할 비교 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ [수평 분할 (Horizontal Fragmentation)] │
│ ─────────────────────────────────────── │
│ • 행(Tuple) 단위로 분할 │
│ • 각 분할은 원래 테이블의 일부 행을 포함 │
│ • 분할 조건: WHERE 절 predicate 기반 │
│ • 예: 지역별 고객 테이블 분할 (서울, 부산, 인천) │
│ │
│ 원래 테이블 분할 결과 │
│ ┌──────┬──────┬────────┐ ┌──────┬──────┬────────┐ │
│ │ ID │ Name │ Region │ │ ID │ Name │ Region │ │
│ ├──────┼──────┼────────┤ ├──────┼──────┼────────┤ │
│ │ 1 │ Kim │ Seoul │ │ 1 │ Kim │ Seoul │ │
│ │ 2 │ Lee │ Busan │ │ 3 │ Park │ Seoul │ │
│ │ 3 │ Park │ Seoul │ └──────┴──────┴────────┘ Seoul_Fragment │
│ │ 4 │ Choi │ Incheon│ ┌──────┬──────┬────────┐ │
│ │ 5 │ Jung │ Busan │ │ 2 │ Lee │ Busan │ │
│ └──────┴──────┴────────┘ │ 5 │ Jung │ Busan │ │
│ └──────┴──────┴────────┘ Busan_Fragment │
│ │
│ [수직 분할 (Vertical Fragmentation)] │
│ ───────────────────────────────────── │
│ • 열(Attribute) 단위로 분할 │
│ • 각 분할은 원래 테이블의 일부 열을 포함 │
│ • 반드시 Primary Key를 모든 분할에 포함해야 함 │
│ • 예: 고객 기본 정보와 상세 정보 분리 │
│ │
│ 원래 테이블 분할 결과 │
│ ┌──────┬──────┬──────┬────────┐ ┌──────┬──────┐ ┌──────┬────────┐ │
│ │ ID │ Name │ Email │ Phone │ │ ID │ Name │ │ ID │Email|Phone│ │
│ ├──────┼──────┼──────┼────────┤ ├──────┼──────┤ ├──────┼────────┤ │
│ │ 1 │ Kim │a@a.com│ 1111 │ │ 1 │ Kim │ │ 1 │a@a.com│1111│ │
│ │ 2 │ Lee │b@b.com│ 2222 │ │ 2 │ Lee │ │ 2 │b@b.com│2222│ │
│ └──────┴──────┴──────┴────────┘ └──────┴──────┘ └──────┴────────┘ │
│ Main Fragment Detail Fragment │
│ │
│ [복합 분할 (Hybrid/Mixed Fragmentation)] │
│ ────────────────────────────────────────── │
│ • 수평 분할 + 수직 분할 조합 │
│ • 먼저 수직 분할 후 각 분할을 다시 수평 분할하거나, 그 반대로 적용 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
분할 정합성 규칙
┌─────────────────────────────────────────────────────────────────────────────┐
│ 분할 정합성 (Fragmentation Correctness) 규칙 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ [완전성 (Completeness)] │
│ ───────────────────── │
│ • 원래 테이블의 모든 데이터가 분할에 포함되어야 함 │
│ • 예: customers 테이블의 모든 튜플이 분할에 존재해야 함 │
│ │
│ [재구성 가능성 (Reconstruction)] │
│ ───────────────────────── │
│ • 분할된 데이터로부터 원래 테이블을 완전히 재구성할 수 있어야 함 │
│ • 수평 분할: UNION으로 재구성 │
│ • 수직 분할: JOIN으로 재구성 │
│ • 복합 분할: UNION + JOIN 조합 │
│ │
│ [중복 없음 (Disjointness)] │
│ ──────────────────── │
│ • 수평 분할: 각 튜플이 하나의 분할에만 존재 (중복 없음) │
│ • 수직 분할: Primary Key 제외한 컬럼이 중복되지 않음 │
│ • 예외: 복제가 의도된 경우 (별도 설계) │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 분할 정합성 검증 예시 │ │
│ │ │ │
│ │ customers 테이블 (3개 튜플) │ │
│ │ │ │
│ │ Fragment 1: region = 'SEOUL' → 2개 튜플 │ │
│ │ Fragment 2: region = 'BUSAN' → 1개 튜플 │ │
│ │ │ │
│ │ 검증: │ │
│ │ • 완전성: 2 + 1 = 3 = 원래 테이블 (OK) │ │
│ │ • 중복 없음: 두 Fragment에 동일한 튜플 없음 (OK) │ │
│ │ • 재구성: Fragment1 UNION Fragment2 = 원래 테이블 (OK) │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
분할 전략 결정
┌─────────────────────────────────────────────────────────────────────────────┐
│ 분할 전략 결정 요소 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 분할 대상 테이블 식별 │
│ ────────────────────── │
│ • 대량 데이터 테이블 (수백만 건 이상) │
│ •频繁하게 전체 스캔하는 테이블 │
│ • 특정 조건으로频繁查询하는 테이블 │
│ │
│ 2. 분할 키 선택 │
│ ────────────── │
│ • 수평 분할: 범위 기반 (Range) 또는 해시 기반 (Hash) │
│ • 수직 분할: 자주 함께 조회되는 컬럼 그룹 기준 │
│ │
│ 3. 분할 수 결정 │
│ ────────────── │
│ • 너무 많으면: 관리 복잡도 증가, 리소스浪费 │
│ • 너무 적으면: 분할 효과 미흡 │
│ • 권장: 관리 가능 수준에서 적절히 분할 (예: 월별, 지역별) │
│ │
│ 4. 분할 타이밍 │
│ ────────────── │
│ • 최초 설계 시 분할 적용 (Greenfield) │
│ • 기존 테이블에서 온라인 분할 (Brownfield) - 주의 필요 │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 분할 키 선택 가이드 │ │
│ │ │ │
│ │ ✓ 좋은 분할 키: │ │
│ │ • 자주 查询 조건으로 사용되는 컬럼 │ │
│ │ • 분포도 균일한 컬럼 │ │
│ │ • 변경 가능성이 적은 컬럼 │ │
│ │ │ │
│ │ ✗ 피해야 할 분할 키: │ │
│ │ • 분포도 불균일한 컬럼 (예: 성별) │ │
│ │ • 자주 업데이트되는 컬럼 │ │
│ │ • 단일 값을 가진 컬럼 (PK만 있는 경우) │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
[다이어그램 해설] 분할 정합성을 만족해야 분할된 데이터로부터 원래 테이블을 올바르게 재구성할 수 있다. 완전성은 모든 데이터가 분할에 포함되어야 함을, 중복 없음은 데이터가 다른 분할에 중복되지 않음을, 재구성 가능성은 분할로부터 원래 테이블을 복원할 수 있음을 의미한다.
📢 섹션 요약: 데이터 분할은 분할 정합성 규칙(완전성, 재구성 가능성, 중복 없음)을 만족해야 하며, 분할 키 선택과 분할 수 결정이 핵심 설계 요소이다.
Ⅲ. 구현 및 실무 응용 (Implementation & Practice)
PostgreSQL 파티셔닝
-- PostgreSQL: 테이블 파티셔닝
-- 1. 범위 분할 (Range Partitioning)
CREATE TABLE orders (
order_id BIGSERIAL,
customer_id INTEGER,
order_date DATE,
total DECIMAL
) PARTITION BY RANGE (order_date);
-- 분할 테이블 생성
CREATE TABLE orders_2024_q1 PARTITION OF orders
FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');
CREATE TABLE orders_2024_q2 PARTITION OF orders
FOR VALUES FROM ('2024-04-01') TO ('2024-07-01');
CREATE TABLE orders_2024_q3 PARTITION OF orders
FOR VALUES FROM ('2024-07-01') TO ('2024-10-01');
CREATE TABLE orders_2024_q4 PARTITION OF orders
FOR VALUES FROM ('2024-10-01') TO ('2025-01-01');
-- 2. 해시 분할 (Hash Partitioning)
CREATE TABLE customers (
customer_id SERIAL,
name VARCHAR(100),
region VARCHAR(50)
) PARTITION BY HASH (customer_id);
-- 분할 테이블 생성
CREATE TABLE customers_p0 PARTITION OF customers
FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE customers_p1 PARTITION OF customers
FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE customers_p2 PARTITION OF customers
FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE customers_p3 PARTITION OF customers
FOR VALUES WITH (MODULUS 4, REMAINDER 3);
-- 3. 쿼리 실행 (자동 분할 프루닝)
SELECT * FROM orders WHERE order_date >= '2024-01-01' AND order_date < '2024-04-01';
-- → orders_2024_q1만 스캔 (분할 프루닝)
MongoDB Sharding
// MongoDB: 컬렉션 샤딩
// 1. 범위 기반 샤딩 (Range Sharding)
sh.shardCollection("mydb.orders", {order_date: 1})
// → order_date 기준 범위로 분할
// 2. 해시 기반 샤딩 (Hash Sharding)
sh.shardCollection("mydb.customers", {customer_id: "hashed"})
// → customer_id 해시 값으로 분할
// 분할 결과 확인
db.collections.getShardDistribution()
// → 각 샤드에 분배된 데이터 크기 확인
// 쿼리 실행
db.orders.find({order_date: {$gte: ISODate("2024-01-01")}})
// → 해당 범위의 샤드만 접근 (분할 프루닝)
📢 섹션 요약: PostgreSQL, MongoDB 등 주요 DB에서 파티셔닝/샤딩을 지원하며, 범위 분할, 해시 분할 등의 전략을 제공한다.
Ⅳ. 결론
데이터 분할은 대규모 테이블을 물리적 단위로 나누어 저장 관리하는 기법으로, 성능 향상, 관리 편의성, 장애 격리 효과를 제공한다. 수평 분할, 수직 분할, 복합 분할이 있으며, 분할 정합성 규칙을 만족해야 한다. 분할 키 선택과 분할 수 결정이 핵심 설계 요소이다.
📢 섹션 요약: 데이터 분할은 성능과 관리 편의성을 높이지만, 분할 전략 설계 시 분할 정합성과 분할 키 선택을 신중히 고려해야 한다.
핵심 인사이트 ASCII 다이어그램 (Concept Map)
┌─────────────────────────────────────────────────────────────────────────────┐
│ Data Fragmentation Concept Map │
│ │
│ ┌───────────────────────────┐ │
│ │ Data Fragmentation │ │
│ │ (데이터 분할 기법) │ │
│ └───────────┬───────────────┘ │
│ │ │
│ ┌──────────────────┼──────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Horizontal│ │ Vertical │ │ Hybrid │ │
│ │(수평분할) │ │(수직분할) │ │(복합분할) │ │
│ │ 행 단위 │ │ 열 단위 │ │ │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 분할 정합성 규칙 │ │
│ │ 완전성 | 재구성 가능성 | 중복 없음 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
참고
- 데이터 분할은 수평 분할, 수직 분할, 복합 분할이 있다.
- 분할 정합성 규칙(완전성, 재구성 가능성, 중복 없음)을 만족해야 한다.
- 분할 키 선택이 성능에 큰 영향을 미친다.
- 범위 분할, 해시 분할 등의 전략이 있다.