💡 핵심 인사이트
반정규화를 실행하는 물리적인 수술 기법은 크게 3가지로 나뉩니다.
조인을 없애기 위한 테이블 병합, 거대한 테이블을 빠르게 찾기 위한 테이블 분할, 그리고 쿼리 계산을 줄여주는 중복/파생 컬럼 추가입니다.
Ⅰ. 테이블 병합 (Table Merge)
기껏 쪼개놓은 두 테이블을 다시 하나의 뚱뚱한 테이블로 합쳐 조인(Join) 연산을 원천 제거합니다.
- 1:1 관계 병합:
사원_기본정보와사원_상세정보테이블은 어차피 같은 사람을 나타내고 매일 같이 조회되므로 하나의 테이블로 합쳐버립니다. - 1:M (일대다) 관계 병합:
부서와사원테이블을 합칩니다. 사원 수만큼 '부서명' 데이터가 무식하게 중복되겠지만 조인 없이 부서명을 바로 뽑을 수 있습니다. - 슈퍼/서브 타입 병합: 부모(직원)와 자식(정규직, 계약직)을 아예
통합_직원이라는 거대한 통짜 테이블로 다 뭉쳐버립니다.
Ⅱ. 테이블 분할 (Table Split)
병합과 반대로, 너무 거대해져서(로우나 컬럼이 수천 개) 스캔 속도가 느린 테이블을 싹둑 자릅니다.
- 수직 분할 (Vertical Split):
- **칼럼(열)**을 기준으로 자릅니다.
- 100개의 컬럼 중 로그인할 때 매일 쓰는
아이디, 비밀번호만 남겨둔 [핫 테이블]과, 1년에 한 번 보는주소, 출신학교만 모아둔 [콜드 테이블]로 쪼개어 로그인 속도를 미친 듯이 올립니다.
- 수평 분할 (Horizontal Split / Partitioning):
- **로우(행)**를 기준으로 자릅니다.
- 결제 내역 10억 건이 든 테이블을 연도별로 쪼개어
2023결제,2024결제테이블로 나눕니다. "올해 매출액"을 구할 때 작년 데이터는 쳐다보지도 않고 스캔을 끝내므로(파티션 프루닝) 속도가 폭발합니다.
Ⅲ. 칼럼 추가 (Column Addition)
테이블 자체를 부수지 않고, 얌체처럼 남의 테이블 정보를 내 테이블에 살짝 복사(중복)해 오거나 미리 계산된 값을 박아두는 꼼수입니다.
- 중복 칼럼 추가:
주문테이블과회원테이블 조인이 너무 빈번합니다.- 조인을 피하기 위해
주문테이블 끄머리에 아예회원 이름컬럼을 억지로 하나 파서 복사해 둡니다. (이름이 바뀔 때 양쪽을 업데이트해야 하는 위험 발생).
- 파생 칼럼 (Derived Column) 추가:
- 매출액을 구할 때마다
단가 * 수량을 CPU가 계산하게 두는 것은 낭비입니다. - 아예 테이블에 **
총판매액**이라는 파생 컬럼을 물리적으로 파놓고, 주문이 들어올 때 계산된 결괏값을 저장해 버립니다. 나중에 SELECT 할 때 CPU는 계산 없이 저장된 숫자만 쏙 뽑아옵니다.
- 매출액을 구할 때마다
- 이력 칼럼 추가:
- 예전 상태값을 알기 위해 과거 로그를 뒤지는 연산을 막기 위해,
최근_접속일같은 컬럼을 추가해 둡니다.
- 예전 상태값을 알기 위해 과거 로그를 뒤지는 연산을 막기 위해,
📢 섹션 요약 비유: 반정규화 기법은 도서관의 **'속도 중심 서가 개편'**입니다.
- 테이블 병합: 해리포터 1~7권을 한 권의 두꺼운 합본팩으로 제본하여(무겁지만 한 번에 대출).
- 수직 분할: 책이 너무 무거우니 글씨만 있는 책과 그림만 있는 책으로 나눠서 가볍게 만들고.
- 파생 칼럼: 책 맨 뒷장에 '독자 감상평 요약' 포스트잇을 미리 붙여두어, 다음 독자가 책을 다 안 읽어도 결론을 바로 알 수 있게(계산 절약) 해주는 꼼수입니다.