데이터의 조회 성능을 향상시키기 위해 중복을 허용하거나 그룹핑하는 과정이다.
여기서 주의할 점은 조회 성능은 향상될 수 있으나 입력/수정/삭제 성능은 저하될 수 있다.
반정규화는 정규화가 끝난 후 거치게 되며 정규화와 마찬가지로 일정한 룰이 존재한다.
반정규화 적용하는 이유
1. 데이터를 조회할 때 디스크 I/O량이 많아서 성능이 저하
2. 조회 경로가 너무 멀어 조인으로 인한 성능 저하
3. 컬럼을 계산하여 읽을 때 성능이 저하
위 상황이 예상되는 경우 반정규화를 수행하게 된다.
| 종류 | 분류 | 반정규화 기법 | 설명 |
|---|---|---|---|
| 테이블 반정규화 | 테이블 병합 | 1:1 관계 테이블병합 | |
| 1:M 관계 테이블병합 | 이경우 1쪽의 속성 개수가 많으면 많을 수록 병합시 중복 데이터가 많아지므로 테이블 병합에 적절하지 못하다. | ||
| 슈퍼/서브타입 테이블 병합 | 트랜잭션은 항상 전체를 통합하여 분석 처리하는데 하나로 통합되어 있으면 테이블에 집적된 데이터만 읽어 처리할 수 있어 다른 형식에 비해 성능 우수 | ||
| 테이블 분할 | 수직분할 | 일부 컬럼을 별도의 테이블로 분할 (분할한 후 1:1 관계가 성립됨) | |
| 수평분할 | ⭐️ 파티셔닝 기법 | ||
| 테이블 추가 | 중복테이블 추가 | ||
| 통계테이블 추가 | |||
| 이력테이블 추가 | |||
| 부분테이블 추가 | 디스크 I/O를 줄이기위해 자주 조회되는 컬럼들을 별도로 모아 놓는 기법 | ||
| ==== | ==== | ==== | ==== |
| 컬럼 반정규화 | 중복컬럼 추가 | 조인 감소를 위해 여러 테이블에 동일한 컬럼을 추가 | |
| 파생컬럼 추가 | 조회 성능향상을 위해 미리 계산된 컬럼을 추가 | ||
| 이력테이블 컬럼 추가 | 최신값을 처리하는 이력의 특성을 고려하여 기능성 컬럼을 추가 | ||
| PK에 의한 컬럼 추가 | |||
| 응용시스템 오작동을 위한 컬럼 추가 |
반정규화 대상조사
다른 방법유도 검토
반정규화 적용
⭐️ 테이블 수직 분할 (1:1 관계 테이블 분리) &
로우 체이닝
1. 한 테이블에 많은 컬럼이 존재할 경우 ▶️ 로우 체이닝 발생 가능성 높음
2.로우 체이닝이 발생한 경우 ▶️ 디스크 I/O 증가로 인해 조회 성능이 떨어짐
- 접근 빈도에 따라 컬럼 위치를 조정 & NULL 상태인 컬럼 뒤쪽으로 위치 변경 ▶️ Row 길이를 어느정도 감소시킬 수 있으나, NULL상태이던 컬럼이 나중에 채워지게 되는 경우 더 많은
로우 체이닝이 발생하게 됨 (그리 바람직하지 못한 해결법)- ✅ 접근 빈도가 높은 것과 낮은 것을 구분하여 1:1로 테이블을 분리 ▶️ 디스크 I/O가 줄어들어 성능 향상
⭐️ 테이블 수평 분할 (파티셔닝 기법)
논리적으로는 하나의 테이블이지만 물리적으로는 여러 개의 테이블로 분리하는 기법
- 데이터 액세스 성능 향상
- 데이터 관리방법도 개선 가능
⭐️ PK 순서 결정 기준
인덱스는 값의 범위에 따라 일정하게 정렬되어 있다.
1. EQUAL=조건으로 조회되는 컬럼이 가장 앞에
2. BETWEEN 범위조회 조건으로 조회되는 컬럼이 그 다음 위치
위 순서로 위치하는 것이 인덱스 액세스범위를 좁할 수 있는 가장 좋은 방법이다.
❓ 인덱스 정렬구조 알아보자.