패스트캠퍼스 강의와 이기적 기본서를 기반으로 공부합니다.
1. 성능 데이터 모델링의 정의
- 데이터 베이스 성능 향상이 목적
- 설계 단계의 데이터 모델링부터 정규화, 반정규화, 테이블 통합, 테이블 분할, 조인구조, PK, FK 등 여러 가지 성능과 관련된 사항이 데이터 모델링에 반영될 수 있도록 하는 것
수행 시점
출처: t.ly/Um18
- 분석/설계 - 구현 - 테스트 - 운영의 단계 중에서, 사전에 할수록 비용이 들지 않음
- 분석/설계 단계에서 데이터베이스 처리 성능을 향상시킬 수 있는 방법을 고려해야 함
2. 성능 데이터 모델링 고려사항
- 정규화를 정확하게 수행
정규화된 모델은 데이터를 주요 관심사별로 분산시키는 효과가 있음
- 데이터베이스 용량 산정
- 데이터베이스에 발생되는 트랜잭션의 유형 파악
CRUD 메트릭스 혹은 시퀀스 다이어그램(객체지향 모델링)을 보고 파악 가능
- 용량과 트랜잭션의 유형에 따라 반정규화 수행
테이블 반정규화 / 속성 반정규화 / 관계 반정규화
- 이력 모델의 조정, PK/FK 조정, 슈퍼타입/서브타입 조정 등 수행
PK/FK를 성능이 우수한 순서대로 칼럼의 순서를 조정해야 함
- 성능 관점에서 데이터 모델 검증
3. 정규화
- 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반 속성을 의존자로 하여 입력/수정/삭제 및 이상현상을 제거하는 것
- 목적: 데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성, 데이터 모델의 독립성 확보
- 한 테이블의 데이터 용량이 최소화되는 효과가 있음 - 데이터의 중복 속성을 제거, 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되기 때문
- 비즈니스에 변화가 발생해도 데이터 모델의 변경을 최소화할 수 있음
- 정규화된 테이블은 데이터를 처리할 때 속도가 빨라질 수도, 느려질 수도 있음
- 조회는 처리 조건에 따라 성능 향상 혹은 저하
- 입력, 수정, 삭제는 성능 향상됨
용어
- 정규형 normal form : 정규화 결과에 의해 도출된 데이터 모델이 갖춰야 할 특성
- 함수적 족송성 Functional Dependency : 테이블의 칼럼 A의 값을 알면 다른 칼럼 B값을 알 수 있다고 할 때, 칼럼 B는 칼럼 A에 함수적 종속성이 있음. 이때 칼럼 A는 결정자(determinant), 칼럼 B는 의존자.
정규화 절차
BCNF, 제4정규화, 제5정규화는 출제되지 않는다고 해서 패스!
제1정규화 |
모든 속성은 원자 값을 가져야함 기본키(primary)를 설정함 다중 값을 가질 수 있는 속성은 분리되어야 함 |
제2정규화 |
제1정규형을 만족하는 상태에서 모든 non-key컬럼은 기본 키 전체에 종속되어야 함 기본 키가 2개 이상의 속성으로 이루어진 경우, 부분 함수 종속성을 분해 기본 키에 종속적이지 않거나 기본 키 일부 컬럼에만 종속적인 컬럼은 분리 필요 |
제3정규화 |
기본키를 제외한 컬럼 간에 종속성 제거 (=이행 함수 종속성 제거) 일반속성들 간 종속관계가 존재하면 분리 필요 |
제2정규화가 필요한 종속성 문제가 있는 테이블 예시. 출처: t.ly/ETFh
정규화와 성능
- 정규화는 데이터 조회 시 조인을 유발하기 때문에 CPU와 메모리를 많이 사용
- 조인이 발생하더라도 효율적인 인덱스 사용을 통해 조인 연산 수행 시 성능 상 단점은 거의 없음
- 정규화 후 소량의 테이블이 생성되면, 그 테이블을 먼저 읽어 조인 연산 수행 →성능 상 유리
4. 반정규화
- 성능을 향상시키기 위해 데이터 중복 허용, 조인을 줄이는 방법
- 칼럼 / 테이블 / 관계의 반정규화로 구분 가능
- 데이터 무결성이 깨지는 위험을 무릅쓰고 반정규화를 적용하는 이유
- 데이터 조회 시 디스크 I/O량이 많아서 성능이 저하
- 경로가 너무 멀어 조인으로 인한 성능 저하 예상
- 칼럼을 계산하여 읽을 때 성능이 저하될 것이 예상
- 반정규화를 수행하는 경우
- 정규화에 충실하면 종속성, 활용성은 향상되지만 수행 속도가 느려지는 경우
- 다량의 범위를 자주 처리해야 하는 경우
- 특정 범위의 데이터만 자주 처리하는 경우
- 요약/집계 정보가 자주 요구되는 경우
반정규화 절차
- 반정규화 대상 조사
- 다른 방법 유도 검토 (e.g 클러스터링, 뷰 테이블, 인덱스 조정, 응용프로그램, 파티션 등)
- 반정규화 적용
반정규화 기법 1. 테이블 반정규화
테이블 병합 |
1:1 관계 테이블 병합 |
1:1 관계의 테이블을 하나로 병합해서 성능 향상 |
1:N 관계 테이블 병합 |
1:N 관계의 테이블을 병합하여 성능 향상, but 많은 양의 데이터 중복 발생 |
슈퍼/서브타입 테이블 병합 |
슈퍼/서브 타입 관계가 발생하면 통합하여 성능 향상 |
테이블 분할 |
수직 분할 |
디스크 I/O 분산 처리를 위해 두 개 이상의 테이블로 컬럼 분리 트랜잭션의 처리되는 유형 파악이 선행되어야 함 |
수평 분할 |
row 단위로 집중 발생되는 트랜잭션을 분석하여 분리 디스크 I/O 및 데이터 접근 효율을 높임 |
테이블 추가 |
중복 테이블 추가 |
다른 업무이거나 다른 서버일 경우 테이블을 중복해 원격 조인 제거 |
통계 테이블 추가 |
합계, 평균 등의 계산 결과를 특정 컬럼에 추가 |
이력 테이블 추가 |
마스터 테이블에 존재하는 레코드를 중복하여 이력 테이블에 추가 |
부분 테이블 추가 |
자주 이용하는 컬럼을 모아놓은 별도의 테이블 생성 |
반정규화 기법 2. 칼럼의 반정규화
중복 칼럼 추가 |
조인을 감소시키기 위해 중복 컬럼 사용 |
파생 칼럼 추가 |
트랜잭션 처리를 위해 발생하는 e.g 판매금액 합계 |
이력 테이블 칼럼 추가 |
대량의 이력 데이터를 조회하기 위해 최근값, 종료일자 등 이력테이블에 컬럼 추가 |
PK에 의한 칼럼 추가 |
복합 의미를 갖는 PK를 단일 속성으로 구성했을 때 발생 PK안에 데이터가 존재하지만 성능 향상을 위해 일반 속성으로 생성 |
응용 시스템의 오작동을 위한 칼럼 추가 |
업무적으로 의미가 없지만 사용자의 실수로 인해 원래 값의 복구가 필요한 경우 임시적으로 중복하여 보관 |
반정규화 기법 3. 관계 반정규화
- 중복 관계 추가: 데이터를 처리하기 위해 여러 경로가 있어 조인이 가능하지만, 이로 인한 성능 저하를 막기 위해 추가적인 관계를 맺는 방법
- 관계의 반정규화는 데이터 무결성을 깨뜨릴 위험 없이 데이터 처리 성능을 향상할 수 있음 (데이터의 중복 저장 X)