반정규화
반정규화
- 정규화된 엔터티, 속성, 관계에 대해 시스템의 성능향상과 개발과 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링의 기법을 의미한다.
- 데이터베이스서버가 분리 되어 분산데이터베이스가 구성되어 있을 때 반정규화를 통해 성능을 향상시킬 수 있다.
* 협의의 반정규화
- 데이터를 중복하여 성능을 향상시키기 위한 기법이라고 정의할 수 있다.
* 넓은 의미의 반정규화
- 성능을 향상시키기 위해 정규화된 데이터 모델에서 중복, 통합, 분리 등을 수행하는 모든과정.
Because. 데이터를 조회할때 디스크 I/O량이 많아서 성능이 저하되거나 경로가 너무 멀어 조인으로 인한 성능저하가 예상되거나 칼럼을 계산하여 읽을 때 성능이 저하될 것이 예상되는 경우 반정규화를 수행하게 된다.
반정규화를 기술적으로 수행하지 않는 경우
- 성능이 저하된 데이터베이스가 생성될 수 있다.
- 구축단계나 시험단계에서 반정규화를 적용할 때 수정에 따른 노력비용이 많이 들게 된다.
반정규화의 기법
* 테이블 반정규화
기법 분류 |
기법 |
내용 |
테이블 병합 |
1:1 관계 테이블 병합 |
각 관계를 통합하여 성능 향상 |
1:M 관계 테이블 병합 |
||
슈퍼 / 서브 타입 테이블 병합 |
||
테이블 분할 |
수직 분할 |
칼럼 단위의 테이블을 디스크 I/O를 분산처리 하기 위해 테이블을 1:1로 분리하여 성능 향상( 트랜잭션의 처리되는 유형을 파악하기 쉽다. ) |
수평 분할 |
로우 단위로 집중 발생되는 트랜잭션을 분석하여 디스크 I/O 및 데이터 접근의 효율성을 높여 성능을 향상시키기 위해 로우 단위로 테이블을 쪼갠다. |
|
테이블 추가 |
중복 테이블 추가 |
다른 업무이거나 서버가 다른 경우 동일한 테이블 구조를 중복하여 원격조인을 제거하여 성능을 향상 |
통계 테이블 추가 |
SUM, AVG 등을 미리 수행하여 계산해 둠으로써 조회 시 성능을 향상 |
|
이력 테이블 추가 |
이력 테이블 중에서 마스터 테이블에 존재하는 레코드를 중복하여 이력테이블에 존재하는 방법 |
|
부분 테이블 추가 |
하나의 테이블을 전체 칼럼 중 자주 이용하는데 자주 이용하는 집중화된 칼럼들이 있을 때 디스크 I/O를 줄이기 위해 해당 칼럼들을 모아 놓은 별도의 반정규화된 테이블을 생성 |
* 칼럼 반정규화
반정규화 기법 |
내용 |
중복칼럼 추가 |
Join에 의해 처리할 때 성능저하를 예방하기 위해 즉, Join을 감소시키기 위해 중복된 칼럼을 위치 |
파생칼럼 추가 |
트랜잭션이 처리되는 시점에 계산에 의해 발생되는 성능저하를 예방하기 위해 미리 값을 계산하여 칼럼에 보관. Derived Colum이라 한다. |
이력테이블 칼럼 추가 |
대량의 이력데이터를 처리할 때 불특정 날 조회나 최근 값을 조회할 때 나타날 수 있는 성능저하를 예방하기 위해 이력테이블에 기능성 칼럼 (최근값 여부, 시작과 종료일자 등 )을 추가한다. |
PK에 의한 칼럼 추가 |
복잡한 의미를 갖는 PK를 단일 속성으로 구성하였을 경우 발생된다. 단일 PK안에서 특정 값을 별도로 조회하는 경우 성능저하가 발생될 수 있다. 이 때 이미 PK안에 데이터가 존재하지만 성능 향상을 위해 일반속성으로 포함하는 방법이 PK에 의한 칼럼 추가 반정규화라고 한다. |
응용시스템 오작동을 위한 칼럼 추가 |
업무적으로는 의미가 없지만 사용자가 데이터처리를 하다가 잘못 처리하여 원래값으로 복구하기를 원하는 경우 이전 데이터를 임시적으로 중복하여 보관하는 기법. 칼럼으로 데이터를 보관하는 방법은 오작동 처리를 위한 임시적인 기법이지만 이것을 이력 데이터 모델로 풀어내면 정상적인 데이터 모델의 기법이 될 수 있다. |
* 관계의 반정규화
반정규화 기법 |
내용 |
중복관계 추가 |
데이터를 처리하기 위한 여러 경로를 거쳐 조인이 가능하지만 이 때 발생할 수 있는 성능 저하를 예방하기 위해 추가적인 관계를 맺는 방법이 관계의 반정규화이다. |
참고. 테이블과 칼럼의 반정규화는 데이터 무결성에 영향을 미치게 되나 관계의 반정규화는 데이터 무결성을 깨뜨릴 위험을 갖지 않고서도 데이터처리의 성능을 향상시킬 수 있는 반정규화의 기법임.
'IT > SQLD(SQL개발자)' 카테고리의 다른 글
[SQLD] 데이터베이스 구조와 성능 (0) | 2019.06.19 |
---|---|
[SQLD] 대량 데이터에 따른 성능 (0) | 2019.06.18 |
[SQLD] 정규화와 성능 (0) | 2019.06.16 |
[SQLD] 성능 데이터 모델링의 개요 (0) | 2019.06.15 |
[SQLD] 데이터 모델링관점과 분류 (0) | 2019.06.13 |