[SQLD]★반정규화★

    # 반정규화란?

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

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

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

    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

    댓글