Meme's IT

[SQLD]★반정규화★ 본문

공부/SQLD

[SQLD]★반정규화★

Memez 2023. 10. 22. 23:29

# 반정규화란?

데이터를 중복, 통합, 분리하여 성능을 향상시키는 기법

데이터 무결성이 깨질 수 있는 위험을 감수하고 조회속도를 향상

하지만 데이터 모델의 유연성은 낮아짐

half정규화가 아니라 reverse정규화임

 

 

# 반정규화를 해야하는 이유?

  • 디스크 I/O 양이 많아서 성능이 저하된 경우
  • 경로가 너무 멀어 JOIN으로 인해 성능이 저하된 경우
  • 다량의 범위를 자주 처리해야하는 경우
  • 칼럼을 계산하여 읽을 때 성능이 저하되는 경우 등등..

 

 


# 반정규화의 절차

1. 반정규화 대상 조사

: 데이터 처리 범위, 통계성 등을 확인해서 대상을 조사한다

 

2. 다른 방법 검토

  • VIEW 사용: 지나치게 많은 JOIN이 걸리는 경우
  • 클러스터링 or 인덱스 조정: 대량의 데이터처리나 부분처리에 의해 성능이 저하되는 경우
더보기

클러스터링이란?

  • 자주 사용되는 테이블의 데이터를 디스크같은 물리적인 위치에 정렬에서 저장시키는 방법
  • 데이터 조회 성능 향상
  • 데이터 저장, 수정, 삭제 성능은 감소
  • 파티셔닝: PK의 성격에 따라 부분적인 테이블로 분리할 수 있을 때, 파티셔닝 키에 의해 물리적 저장공간 분리 
  • 캐시: 응용 애플리케이션에서 로직을 구사하는 방법을 변경해서 성능을 향상

3. 반정규화 적용

테이블과 속성, 관계에 대해 중복, 추가, 분할, 제거 하는 방법을 이용해 반정규화 적용

 


# 반정규화 기법

1. 테이블 반정규화

(1) 테이블 병합

  • 1:1 관계 테이블 병합
  • 1:M 관계 테이블 병합: 많은 양의 데이터 중복이 발생한다
  • 슈퍼 / 서브타입 테이블 병합
더보기

Super Type & Sub Type

  • 공통인 부분 = 슈퍼 타입
  • 공통으로부터 상속받아 다른 엔티티와 차이가 있는 속성 = 서브타입
  • 예를 들어, 일반 고객과 법인 고객이 있을 때, 고객이 슈퍼타입, 일반과 법인이 서브타입이 된다

(2) 테이블 분할

  • 수직 분할: 하나의 테이블을 두 개 이상의 테이블로 분할, Column을 분할하여 새로운 테이블 만들기
  • 수평 분할: row 단위로 집중 발생되는 트랜잭션을 분석해서 데이터 접근의 효율성을 높여 성능을 향상시키기 위해 row단위로 테이블 분리

(3) 테이블 추가

  • 중복테이블 추가: 다른 업무이거나 서버가 다른 경우 동일한 테이블 구조를 중복해서 원격 조인을 제거해서 성능향상
  • 통계테이블 추가: SUM, AVG 등을 미리 수행해둠
  • 이력테이블 추가: 최신값을 처리하는 이력의 특성을 고려해서 칼럼 추가, 최근 값을 찾기 위한 조회 성능 저하를 예방
  • 부분테이블 추가: 하나의 테이블에서 자주 이용하는 칼럼이 있을 때, 그 칼럼들만 모아놓은 별도의 테이블을 생성

 

2. 칼럼 반정규화

  • 중복 칼럼 추가: 조인을 감소시키기 위해
  • 파생 칼럼 추가: 트랜잭션을 처리할 때 계산에 의해 발생되는 성능저하를 예방하기 위해 미리 값을 계산하여 칼럼에 저장 (= Derived Column)
  • 이력 테이블 칼럼 추가: 이력테이블에 기능성 칼럼을 추가( 최근값 여부, 시작과 종료일자 등등)
  •  PK에 의한 칼럼 추가: PK를 일반 속성으로 생성
  • 응용 시스템의 오작동을 위한 칼럼 추가: 이전 데이터를 임시적으로 중복해서 보관하는 기법

 

3. 관계 반정규화

→ 데이터 무결성 유지

  • 중복관계 추가: 데이터를 처리하기 위해 여러경로를 거쳐서 조인이 가능하지만, 이 때 발생할 수 있는 성능저하를 예방하기 위해 추가적인 관계를 맺는 방법

 

 

'공부 > SQLD' 카테고리의 다른 글

[SQLD] DB의 구조와 성능  (0) 2023.10.23
[SQLD] 대용량 데이터에 따른 성능  (0) 2023.10.22
[SQLD] ★정규화★와 성능  (0) 2023.10.18
[SQLD] 성능 데이터 모델링  (0) 2023.10.18
[SQLD] 식별자  (0) 2023.10.17