이번 강은 변경 데이터를 다루는 MERGE·Change Data Feed·SCD를 다룬다.
원천에서 삽입·수정·삭제가 섞여 들어올 때, 이를 타깃에 정확히 반영하고 이력까지 관리하는 방법이다.
이 강의 목표는 다음과 같다.
- MERGE로 upsert를 구현한다.
- Change Data Feed로 변경을 하류에 전파한다.
- SCD Type 1/2로 차원 이력을 관리한다.
1. MERGE — upsert
MERGE 한 문장으로 "있으면 갱신, 없으면 삽입, 조건 맞으면 삭제"를 처리한다.
MERGE INTO tgt USING src ON tgt.id = src.id
WHEN MATCHED AND src.op = 'delete' THEN DELETE
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;
중복 소스가 있으면 MATCHED가 모호해져 실패하므로, 소스를 먼저 중복 제거(dedup)한다.
2. Change Data Feed (CDF)
CDF를 켜면 테이블의 행 단위 변경(insert/update/delete)을 조회할 수 있다.
ALTER TABLE tgt SET TBLPROPERTIES (delta.enableChangeDataFeed = true);
SELECT * FROM table_changes('tgt', 5); -- 버전 5 이후 변경분
- 하류 파이프라인이 전체가 아닌 바뀐 행만 읽어 증분 처리한다.
3. SCD (Slowly Changing Dimension)
차원 데이터가 시간에 따라 바뀔 때의 처리 방식이다.
| 유형 | 방식 |
|---|---|
| Type 1 | 덮어쓰기(이력 없음) |
| Type 2 | 새 행 추가 + 유효기간(start/end)·현재 플래그로 이력 보존 |
Type 2는 MERGE로 기존 현재 행을 만료시키고 새 버전 행을 삽입해 구현한다.
예제
예제) 고객의 주소가 바뀌어도 과거 주문이 어느 주소로 갔는지 이력을 남겨야 한다. 어떤 방식인가?
해설) SCD Type 2다. 주소가 바뀌면 기존 행의 end_date를 채워 만료시키고, 새 주소로 현재 플래그가 켜진 새 행을 추가한다. MERGE로 만료 UPDATE와 새 행 INSERT를 함께 처리한다. 과거 주문은 당시 유효했던 행과 조인되어 이력이 보존된다.
샘플 문제
문) 하류 파이프라인이 전체 재처리 없이 바뀐 행만 소비하게 하려면?
- (A) VACUUM 활성화
- (B) Change Data Feed 활성화 후 table_changes 조회
- (C) OPTIMIZE ZORDER
- (D) 매번 전체 OVERWRITE
정답: (B). CDF를 켜면 행 단위 변경을 조회할 수 있어, 하류는 바뀐 행만 증분 처리한다.
정리
- MERGE로 upsert·삭제를 한 문장에 처리(소스 중복은 먼저 dedup).
- CDF로 행 단위 변경을 조회해 하류에 증분 전파한다.
- SCD Type 1은 덮어쓰기, Type 2는 유효기간으로 이력 보존.
- Type 2는 MERGE로 만료+삽입을 함께 구현한다.
다음 강에서는 이 데이터를 어떻게 모델링하는지 다룬다.
댓글 0
댓글은 운영자만 작성할 수 있어요.