반정규화(De-Normalization)란?
- 정규화된 엔터티, 속성, 관계에대해 시스템 성능 향상과 개발과 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링 기법
- 조회시 디스크 I/O거 많거나 경로가 멀어 조인에 의한 성능 저하를 막기 위해 수행
* 디스크 I/O : 데이터를 작성 하고 변경 할적에 디스크 즉 하드디스크에 그것이 저장되는 것
- 일반적으로 정규화시 입력/수정/삭제 성능이 향상되며 반정규화시 조인 성능이 향상된다.
반 정규화 절차
1) 반정규화 대상 조사
(범위처리빈도수, 범위, 통계성)
- 자주 사용되는 테이블 에 접근하는 프로세서의 수가 많고 항상 일정한 범위만을 조회하는 경우
- 테이블에 대량의 데어터가 있고 대량의 데이터 범위를 자주 처리하는 경우에 처리범위를 일정하게 줄이지 않으면 성능을 보장할 수 없는 경우
- 통계성 프로세스에 의해 통계 정보를 필요로 할때 별도의 통계테이블을 생성
- 테이블에 지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우
2) 다른 방법 유도 검토
(뷰, 클러스터링, 인덱스 조정)
- VIEW 사용 : 지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우 VIEW 사용
(다만, VIEW 가 직접적으로 성능을 향상 시키지는 않는다.)
- * 클러스터링 : 대량의 데이터처리나 부분처리에 의해 성능이 저하되는 경우, 클러스터링을 적용하거나 인덱스를 조정함
(조회가 대부분 일때 클러스터링 적용)
3) 파티셔닝
: 대량의 데이터는 PK의 성격에 따라 부분적인 테이블로 분리할 수 있다. 파티셔닝 키에 의해 물리적 저장공간 분리
4) 캐시
: 응용 애플리케이션에서 로직을 구사하는 방법을 변경함으로써 성능을 향상시킬 수 있음
반정규화 기법
<테이블 반 정규화>
분류 | 기법 | 내용 |
테이블 병합 | 1 : 1 관계 테이블 병합 | 1 : 1 관계를 통합하여 성능 향상 |
1 : M 관계 테이블 병함 | 1 : M 관계를 통합하여 성능 향상 | |
슈퍼/서브타입 테이블 병합 | 슈퍼/서브 관계를 통합하여 성능 향상 | |
테이블 분할 | 수직분할 | 컬럼단위의 테이블을 디스크 I/O를 분산처리하기위해 테이블을 1:1로 분리하여 성능향상 (트랜잭션의 처리되는 유형파악이 선행되어야함) |
수평분할 | 로우단위로 집중 발생되는 트랜잭션을 분석하여 디스크I/O 및 데이터 접근의 효율성을 높여 성능을 향상하기 위해 로우단위로 테이블을 쪼갬 ( 관계가 없음 ) | |
테이블 추가 | 중복 테이블 추가 | 다른 업무이거나 서버가 다른 경우 동일한 테이블 구조를 중복하여 원격조인을 제거하여 성능 향상 |
통계 테이블 추가 | SUM, AVG 등을 미리 수행하여 계산해 둠으로써 조회 시 성능을 향상 | |
이력 테이블 추가 | 이력테이블 중에서 마스터 테이블에 존재하는 레코드를 중복하여 이력테이블에 존재하는 방법 | |
부분 테이블 추가 | 하나의 테이블을 전체 칼럼 중 자주 이용하는 집중화된 칼럼이 있을 경우, 디스크I/O를 줄이기 위해 해당 컬럼들을 모아놓은 별도의 반정규화된 테이블을 생성 |
* 수평/수직 분할의 절차
1. 데이터 모델링을 완성한다.
2. DB용량을 산정한다.
3. 대량 데이터가 처리되는 테이블에 대해 트랜잭션 터리 패턴을 분석한다.
4. 칼럼 단위로 집중화된 처리가 발생하는지 로우단위로 집중화된 처리가 발생하는지 분석하여
집중화된 단위로 테이블 분리하는 것을 검토한다.
- 컬럼 많음 → 1:1 분리
- 데이터 많음 → 파티셔닝
* 슈퍼/서브 타입 모델
슈퍼타입 : 공통 부분
서브타입 : 공통으로부터 상속받아 다른 엔터티와 차이가 있는 속성
<슈퍼/서브타입 데이터 모델의 변환타입 비교>
구분 | OneToOne Type | Plus Type | Single Type |
특징 | 개별 테이블 유지 | 슈퍼+서브타입 테이블 | 하나의 테이블 |
확장성 | 우수함 | 보통 | 나쁨 |
조인성능 | 나쁨 | 나쁨 | 우수함 |
I/O량 성능 | 좋음 | 좋음 | 나쁨 |
관리용이성 | 좋지않음 | 좋지않음 | 좋음(1개) |
트랜잭션 유형에 따른 선택방법 |
개별 테이블로 접근이 많은 경우 선택 | 슈퍼+서브 형식으로 데이터를 처리하는 경우 선택 | 전체를 일괄적으로 처리하는 경우 선택 |
<칼럼 반정규화>
기법 | 내용 |
중복칼럼추가 | 조인시 성능저하를 예방하기 위해, 중복된 컬럼을 위치시킴 |
파생칼럼추가 | 트랜잭션이 처리되는 시점에 계산에 의해 발생되는 성능저하를 예방하기 위해, 미리 계산하여 컬럼에 보관 |
이력테이블 칼럼추가 |
대량의 이력데이터 처리시 불특정 일 조회나 최근 값을 조회할때 나타날 수 있는 성능저하를 예방하기위해 기능성 컬럼( 최근값부여, 시작일자, 종료일자 ) 를 추가함 |
PK에 의한 칼럼추가 |
복합의미를 갖는 PK를 단일 속성으로 구성했을 때 발생되며, PK 안에 데이터가 존재하지만 성능향상을 위해 일반속성으로 포함하는 방법 |
응용시스템 오작동을 위한 칼럼추가 |
업무적으로 의미가 없으나, 데이터 처리시 오류로 인해 원래값으로 복구하길 원하는 경우 이전 데이터를 임시적으로 중복보관하는 방법 |
<관계 반정규화>
: 무결성 유지
기법 | 내용 |
중복관계 추가 | 데이터를 처리하기위한 여러 경로를 거쳐 조인이 가능하지만, 이 때 발생할 수 있는 성능저하를 예방하기 위해 추가적인 관계를 맺는 방법 |
* 클러스터
: 디스크로부터 데이터를 읽어오는 시간을 줄이기 위해서 조인이나 자주 사용되는 테이블의 데이터를 디스크의 같은 위치에 저장시키는 방법
클러스터된 테이블과 클러스터 되지 않은 테이블의 차이
- 테이블이 처음 생성될 때 행은 일반적으로 세그먼트의 첫 익스텐트의 첫 블록부터 삽입됩니다
- 정규 테이블로 저장될 경우 EMP와 DEPT은 서로 다른 세그먼트에 위치하게 됩니다. 이 말은 테이블이 자신들 고유의 블록을 사용한다는 뜻입니다.
- 테이블이 클러스터로 저장되면 클러스터는 물리적 저장 단위가 되고 테이블은 논리적 엔티티 즉, 클러스터의 일부분이 됩니다.
클러스터의 장점
- 그룹된 컬럼 데이터 행들이 같은 데이터 Block에 저장되기 때문에 디스크 I/O를 줄여 줍니다.
- 클러스터된 테이블 사이에 조인이 발생할 경우 그 처리 시간이 단축 됩니다.
- 클러스터키 열을 공유하여 한번만 저장하므로 저장 영역의 사용을 줄입니다.
테이블 클러스터링의 특징
클러스터는 데이터 조회 성능을 향상 시키지만 데이터 저장, 수정, 삭제 또는 한 테이블 전체 Scan의 성능을 감소 시킵니다
클러스터 하기 좋은 테이블
- 주로 조회가 자주 발생하고 수정이 거의 발생하지 않는 테이블
- 컬럼안의 많은 중복 데이터를 가지는 테이블
- 자주 Join되는 테이블
클러스터 Key가 되기 좋은 컬럼
- 데이터 값의 범위가 큰 컬럼
- 테이블 간의 조인에 사용되는 컬럼
클러스터 key가 되기 나쁜 컬럼
- 특정 데이터 값이 적은 컬럼
- 자주 데이터 수정이 발생하는 컬럼
- LONG, LONG RAW 컬럼은 포함할 수 없습니다.
로우 체이닝 : 로우의 길이가 너무 길어서 데이터 블록 하나에 데이터가 모두 저장되지 않고 두개 이상의 블록에 걸쳐 하나의 로우가 저장되어 있는 형태
로우 마이그레이션 : 테이블 블록에서 수정이 발생하면 수정된 데이털ㄹ 해당 데이터 블록에서 저장하지 못하고 다른 블록의 빈 공간을 찾아 저장하는 방식
***로우 체이닝과 로우 마이그레이션이 발생하여 많은 블록에 데이터가 저장되면 DB 메모리에 디스크 I/O가 발생할때 I/O가 발생하여 성능저하 발생 트랜잭션을 분석하여 적절하게 1:1 관계로 분리함으로써 성능향상이 가능하도록 해야한다.
'Self Study > SQLD' 카테고리의 다른 글
[SQLD] 식별자(Identifiers) (0) | 2022.11.04 |
---|---|
[SQLD] 정규화(Normalization) (0) | 2022.11.03 |
[SQLD] 성능데이터 모델링 (0) | 2022.11.03 |
[SQLD] 관계(Relationship) (0) | 2022.11.02 |
[SQLD] 속성(Attribute) (0) | 2022.11.02 |