: 정규화된 엔터티, 속성, 관계에 대해 성능 향상을 목적으로 중복, 통합, 분리 등을 수행하는 데이터 모델링 기법이다.
디스크 I/O량이 많아서 성능이 저하되거나 JOIN으로 인한 성능저하가 예정되거나 칼럼을 계산하여 읽을 때 성능이 저하될 것이 예상되는 경우 반정규화를 수행하게 된다.
- 테이블, 칼럼, 관계의 반정규화를 종합적으로 교려해야 한다.
- 과도한 반정규화는 데이터 무결성을 침해하게 되어 좋지 않다.
반 정규화를 진행하면 데이터 무결성을 침해할 수 밖에 없지만 이를 해결하는 장치를 마련해야 한다.
반정규화에 대한 필요성이 결정이 되면 칼럼의 반정규화 뿐만 아니라 테이블의 반정규화와 관계의 반정규화를 종합적으로 고려하여 적용해야 한다.
- 자주 사용되는 테이블에 접근하는 프로세서의 수가 많고 항상 일정한 범위만을 조회하는 경우 검토한다.
- 테이블에 대량의 데이터 범위를 자주 처리하는 경우에 처리범위를 일정하게 줄이지 않으면 성능을 보장할 수 없는 경우 검토한다.
- 통계성 프로세서에 의해 통계 정보를 필요할 때 별도의 통계 테이블을 생성한다.
- 테이블에 지나치게 많은 JOIN이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우 검토한다.
뷰 - View
생성 : 뷰 자체가 성능 향상을 가져오지 않는다. 신중하게 설계된 뷰를 재사용할 때 성능이 향상된다.- 클러스터링: 자주 사용되는 테이블의 데이터를 디스크의 같은 블록에 저장한다.
- 인덱스의 조정: 인덱스 추가, 삭제 및 순서 조정
조회중심의 테이블이 아니라면 인덱스를 추가하지 않는게 좋다.
- 응용 애플리케이션 : 데이터 처리를 위한 로직 변경 ex. 캐싱, 한방쿼리
반정규화를 적용하기 전 사전에 충분히 성능에 대한 고려가 이루어졌다면 반정규화를 적용해야 한다.
- 테이블 반정규화
- 속성의 반정규화
- 관계의 반정규화
이 3가지의 방법이 있고 추가, 분할, 제거할 수 있다.
기법분류 | 기법 | 내용 |
---|---|---|
테이블병합 | ||
1:1 관계 테이블병합 | 1:1 관계를 통합하여 성능향상 | |
1:M 관계 테이블병합 | 1:M 관계를 통합하여 성능향상 | |
슈퍼/서브타입 테이블병합 | 슈퍼/서브 관계를 통합하여 성능향상 | |
테이블분할 | ||
수직분할 | 칼럼단위의 테이블을 디스크 I/O를 분산처리 하기 위해 테이블을 1:1로 분리하여 성능향상 | |
수평분할 | 로우 단위로 집중 발생하는 트랜잭션을 분석하여 디스크 I/O및 데이터접근의 효율성을 높여 성능을 향상하기 위해 로우단위로 테이블을 쪼갠다. | |
테이블 추가 | ||
중복테이블 추가 | 다른 업무이거나 서버가 다른 경우 동일한 테이블구조를 중복하여 원격조인을 제거하여 성능을 향상 | |
통계테이블 추가 | SUM, AVG등을 미리 수행하여 계선해 둠으로써 조회 시 성능을 향상한다. | |
이력테이블 추가 | 이력테이블중 마스터 테이블에 존재하는 레코드를 중복하여 이력테이블에 존재하는 방법은 반정규화의 유형 | |
부분테이블 추가 | 하나의 테이블의 전체 컬럼 중 자주 이용하는 집중화된 컬럼들을 모아놓는 별도의 반정규화된 테이블 생성 |
-
1-1. 관계 테이블병합 (1:1 or 1:M )
-
1-2. 슈퍼/서브타입 모델의 변환 - Super Type / Sub Type
- 개별 트랜젝션이 많을 경우 → One To One
- 슈퍼타입 + 서브타입 접근 트랜잭션이 많은 경우 → Plus Type
- 여러 서브타입에 대한 동시 접근이 많을 때 → All in One Type
슈퍼/서브타입 모델 변환 타입의 비교
구분 One To One Type Plus Type Single Type 특징 개별 테이블 유지 슈퍼 + 서브타입 테이블 하나의 통합 테이블 확장성 우수함 보통 나쁨 조인 필요 수 많음 보통 적음 I/O 성능저하 양호 양호 좋음 관리 용의성 나쁨 나쁨 좋음 적합
트랜잭션 유형개별 테이블로 접근이 많은 경우 슈퍼 + 서브 형식 데이터 처리가 많은 경우 전체에 대한 일괄 처리가 많은 경우
-
2-1. 테이블 수직 분할
-
2-2. 테이블 수평 분할
-
3-1. 이력테이블 추가
이력테이블 칼럼 추가
와이력테이블 추가
의 차이점
이력테이블을 값을 추가하고, 이력테이블 컬럼 추가는 여부(true, false) 를 추가한다. -
3-2. 부분테이블 추가
- 집중적으로 자주 사용되는 특정 속성들을 추출하여 별도 테이블을 구성한다.
- 테이블 수직 분할과 유사하지만 원본 테이블이 그대로 유지된다.
ex) 차량번호에 대한 차량사진 조회 질의가 많은 경우
반정규화 기법 | 내용 |
---|---|
중복컬럼 추가 | 조인에 의해 처리할 떄 성능저하를 예방하기 위해 중복된 칼럼을 위치시킨다. |
파생컬럼 추가 | 트랜잭션이 처리되는 시점에 계산에 의해 발생되는 성능저하를 예방하기 위해 미리 값을 계산하여 컬럼에 보관한다. > Derived Column이라고 한다. |
이력테이블 칼럼추가 | 대량의 이력데이터를 처리(조회)할 떄 나타날 수 있는 성능저하를 예방하기 위해 이력테이블에 기능성 컬럼을 추가한다. > 최근값 여부, 시작과 종료일자 등... |
PK에 의한 칼럼 추가 | PK가 복합 의미를 갖는 경우 구성 요소 값의 조회 성능 향상을 위해 일반 속성을 추가한다. |
데이터 복구를 위한 칼럼 추가 | 사용자의 실수, 응용프로그램 오류로 인해 데이터가 잘못 처리된 경우, 원래 값으로의 복구를 위해 이전 데이터를 임시적으로 보관하는 컬럼추가 |
조인을 감소시킨다.
-
질의가 예상되는 값을 미리 계산하여 저장한다.
-
2-1. 컬럼에 의한 파생
Derived Column
이라고 한다.- ex. 과목 점수 합계, 평균 등...
-
2-2. 로우에 의한 파생
가급적 사용하지 않아야 한다.
- 특정 로우가 변경되면 모든 로우 값을 다시 계산하게 된다.
- 즉, 인스턴스의 순서에 의존성이 생기므로 사용하지 않아야 한다.
- ex. 공사비 누적(엑셀을 생각하면 됨)
- ex. 최근값, 종료여부 등...
- 차량테이블의 PK가 차량번호(광주 뷁 1234)와 같이 '지역' + '일련번호'로 구성된 경우 지역을 이용한 조회가 빈번한경유
- 지역이라는 컬럼을 생성한다.
- https://youtu.be/z1AcDayMXgY?t=2580
- 사용자의 실수, 응용프로그램의 오류로 인한 데이터 손실 대비를 위해 생성한다
- ex. 고객의 이전 주소, 고객의 이전 데이터 등...
: 조인을 통해 정보 조회가 가능하지만, 조인 경로 단축을 위해 중복관계를 추가한다.
이전글: 3-1. 정규화
다음글: 3-3. Index