[ SQLD : I. 데이터 모델링의 이해] 2-2. 정규화와 성능 / 2-3. 반정규화와 성능

문지은·2023년 6월 1일
0

SQLD

목록 보기
7/30
post-thumbnail

[SQLD 시험 대비] 1과목. 데이터 모델링의 이해 : 2장. 데이터 모델과 성능 - 2. 정규화와 성능
[SQLD 시험 대비] 1과목. 데이터 모델링의 이해 : 2장. 데이터 모델과 성능 - 3. 반정규화와 성능

정규화와 성능

정규화를 통한 성능 향상 전략

  • 정규화를 하면 기본적으로 데이터에 대한 중복성을 제거하 여 주고 데이터가 관심사별로 처리되는 경우가 많기 때문에 성능이 향상되는 특징이 있음
    • 엔터티가 계속 발생되므로 SQL문장에서 조인이 많이 발생하여 이로 인한 성능 저하가 나타나는 경우도 있지만 이런 부분은 사례별로 유의하여 반정규화를 적용하는 전략 필요
  • 정규화를 수행한다는 것은 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반속성을 의존자로 하여 입력/수정/삭제 이상을 제거하는 것
  • 데이터의 중복속성을 제거하고 결정자에 의해 동일한 의미의 일반속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과
  • 정규화된 테이블은 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있는 특성이 있음
    • 일반적으로 정규화가 잘 되어 있으면 입력/수정/삭제의 성능이 향상되고 반정규화를 많이 하면 조회의 성능이 향상
    • 데이터 모델링을 할 때 반정규화만이 조회 성능을 향상시킨다는 고정관념은 탈피해야함
    • 정규화를 해야만 성능이 향상되는 경우가 아주 많이 나타나기 때문

반정규화된 테이블의 성능저하 사례

사례 1

  • 왼쪽 그림은 2차 정규화가 안 된 반정규화된 테이블의 모습이고 오른쪽 그림은 부분키 종속을 정규화하여 두 개의 테이블로 분리해 2차 정규화된 테이블의 모습
  • 2차 정규화가 안된 테이블은 직급명과 함께 반정규화된 관서번호, 관서명을 조회하면 하나의 테이블에서 데이터 조회 가능
  • 2차 정규화된 테이블은 관서번호, 관서명이 관서 테이블에만 존재하기 때문에 두 개의 테이블을 조인하여 처리
  • PK가 걸려있는 방향으로 조인이 걸려 Unique Index를 곧바로 찾아서 데이터를 조회하기 때문에, 하나의 테이블에서 조회하는 작업과 비교했을 때 미미하게 성능 차이가 날 뿐 사용자에게 크게 영향을 줄 만큼 성능이 저하되는 일은 없음

사례 2

  • 매각일자가 결정자가 되고 매각시간과 매각장소가 의존자가 되는 함수적 종속관계가 형성되는 관계
  • 복합식별자 중에서 일반속성이 주식별자 속성 중 일부에만 종속관계를 가지고 있으므로 2차 정규화의 대상이 됨
    • 2차 정규화를 적용하여 매각일자를 PK로 하고 매각시간과 매각장소는 일반속성이 됨
    • 매각일자를 PK로 사용하는 매각일자별매각내역과도 관계가 연결됨 (1:M)

사례 3

  • 아래 그림에서 유형기능분류코드에 따라 데이터를 조회하는 경우가 많이 나타나 인덱스를 생성하려면 유형기능분류코드 각각에 대해 인덱스를 생성해야 하므로 9개나 되는 인덱스를 추가 생성해야 함
  • 중복속성에 대한 분리가 1차 정규화의 정의임을 고려하면 모델 테이블은 1차 정규화의 대상
    • 로우단위의 대상도 1차 정규화의 대상이 되지만 칼럼 단위로 중복이 되는 경우도 1차 정규화의 대상임
    • 모델에 대해 1차 정규화를 적용하면
  • 하나의 테이블에 9개가 반복적으로 나열이 되어 있을 때는 인덱스 생성이 어려웠지만 정규화되어 분리된 이후에는 인덱스 추가 생성이 0개가 됨
    • 분리된 테이블 모델기 능분류코드에서 PK인덱스를 생성하여 이용함으로써 성능 향상

사례 4

  • 사례 3과 마찬가지로 1차 정규화를 통해 일재고와 일재고 상세를 구분함으로써 일재고에 발생되는 트랜잭션의 성능저하를 예방

함수적 종속성(Functional Dependency)에 근거한 정규화 수행

  • 함수의 종속성(Functional Dependency)은 데이터들이 어떤 기준값에 의해 종속되는 현상을 지칭하는 것
    • 이 때 기준값을 결정자(Determinant)라 하고 종속되는 값을 종속자 (Dependent)라고 함
  • 함수의 종속성은 데이터가 가지고 있는 근본적인 속성
    • 기본적으로 데이터는 속성간의 함수종속성에 근거하여 정규화되어야 함
    • 정규화의 궁극적인 목적은 반복적인 데이터를 분리하고 각 데이터가 종속된 테이블에 적절하게(프로세스에 의해 데이터의 정합성이 지켜질 수 있어야 함) 배치되도록 하는 것이므로 함수의 종속성을 이용하여 정규화 작업이 이루어짐

반정규화와 성능

반정규화를 통한 성능향상 전략

반정규화의 정의

  • 정규화된 엔터티, 속성, 관계에 대해 시스템의 성능향상과 개발 (Development)과 운영(Maintenance)의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링의 기법
  • 데이터를 조회할 때 디스크 I/O량이 많아서 성능이 저하되거나 경로가 너무 멀어 조인으로 인한 성능저하가 예상되거나 칼럼을 계산하여 읽을 때 성능이 저하될 것이 예상되는 경우 데이터 무결성이 깨질 수 있는 위험을 무릅쓰고 데이터를 중복하여 반정규화를 적용

반정규화의 적용방법

  • 반정규화 대상 조사
    • 자주 사용되는 테이블에 접근(Access)하는 프로세스의 수가 많고 항상 일정한 범위만을 조회하는 경우
    • 테이블에 대량의 데이터가 있고 대량의 데이터 범위를 자주 처리하는 경우에 처리범위를 일정하게 줄이지 않으면 성능을 보장할 수 없을 경우
    • 통계성 프로세스에 의해 통계 정보를 필요로 할 때 별도의 통계테이블(반정규화 테이블)을 생성
    • 테이블에 지나치게 많은 조인(JOIN)이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우
  • 다른 방법 유도 검토
    • 지나치게 많은 조인(JOIN)이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우 뷰(VIEW)를 사용하면 이를 해결할 수도 있음
    • 대량의 데이터처리나 부분처리에 의해 성능이 저하되는 경우에 클러스터링을 적용하거나 인덱스를 조정함으로써 성능을 향상시킬 수 있음
    • 대량의 데이터는 Primary Key의 성격에 따라 부분적인 테이블로 분리할 수 있음.
      • 파티셔닝 기법(Partitioning) : 인위적인 테이블을 통합/분리하지 않고 물리적인 저장기법에 따라 성능을 향상 시킴
    • 응용 애플리케이션에서 로직을 구사하는 방법을 변경함으로써 성능을 향상시킬 수 있음
  • 반정규화 적용
    • 반정규화는 테이블, 속성, 관계에 대해 적용할 수 있음
    • 테이블과 속성, 관계에 대해 중복으로 가져가는 방법만이 반정규화가 아니고 테이블, 속성, 관계를 추가할 수도 있고 분할할 수도 있으며 제거할 수도 있음

반정규화의 기법

테이블 반정규화

테이블 병합

  • 1:1 관계 테이블 병합
    • 1:1 관계를 통합하여 성능 향상
  • 1:M 관계 테이블 병합
    • 1:M 관계 통합하여 성능 향상
  • 슈퍼/서브타입 테이블 병합
    • 슈퍼/서브관계를 통합하여 성능향상

테이블 분할

  • 수직 분할
    • 칼럼단위의 테이블을 디스크 I/O를 분산처리하기 위헤 테이블을 1:1로 분리하여 성능향상
    • 트랜잭션의 처리되는 유형 파악이 선행되어야 함
  • 수평 분할
    • 로우 단위로 집중 발생되는 트랜잭션을 분석하여 디스크 I/O 및 데이터접근의 효율성을 높여 성능을 향상하기 위해 로우단위로 테이블을 쪼갬

테이블 추가

  • 중복테이블 추가
    • 다른 업무이거나 서버가 다른 경우 동일한 테이블구조를 중복하여 원격조인을 제거하여 성능 향상
  • 통계테이블 추가
    • SUM, AVG 등을 미리 수행하여 계산해 둠으로써 조회 시 성능을 향상
  • 이력테이블 추가
    • 이력테이블 중에서 마스터 테이블에 존재하는 레코드를 중복하여 이력테이블에 존재하는 방법
  • 부분테이블 추가
    • 하나의 테이블의 전체 칼럼 중 자주 이용하는 집중화된 칼럼들이 있을 때 디스크 I/O를 줄이기 위해 해당 칼럼들을 모아놓은 별도의 반정규화된 테이블을 생성

칼럼 반정규화

  • 중복칼럼 추가
    • 조인에 의해 처리할 때 성능 저하를 예방하기 위해 즉, 조인을 감소시키기위해 중복된 칼럼을 위치시킴
  • 파생칼럼 추가
    • 트랜잭션이 처리되는 시점에 계산에 의해 발생되는 성능저하를 예방하기 위해 미리 값을 계산하여 칼럼에 보관
    • Derived Column 이라고 함
  • 이력테이블 칼럼 추가
    • 대량의 이력데이터를 처리할 때 불특정 날 조회나 최근 값을 조회할때 나타날 수 있는 성능저하를 예방하기 위해 이력테이블에 기능성 칼럼(최근값 여부, 시작과 종료일자 등)을 추가
  • PK에 의한 칼럼 추가
    • 복합 의미를 갖는 PK를 단일 속성으로 구성하였을 경우 발생
    • 단일 PK 안에서 특정 값을 별도로 조회하는 경우 성능저하가 발생할 수 있음. 이 때 이미 PK 안에 데이터가 존재하지만 성능향상을 위해 일반속성으로 포함하는 방법
  • 응용시스템 오작동을 위한 칼럼 추가
    • 업무적으로는 의미가 없지만 사용자가 데이터처리를 하다가 잘못 처리하여 원래 값으로 복구하기를 원하는 경우 이전 데이터를 임시적으로 중복하여 보관하는 기법
    • 칼럼으로 이것을 보관하는 방법은 오작동 처리를 위한 임시적인 기법이지만 이것을 이력데이터 모델로 풀어내면 정상적인 데이터 모델의 기법이 될 수 있음

관계 반정규화

  • 중복 관계 추가
    • 데이터를 처리하기 위한 여러 경로를 거쳐 조인이 가능하지만 이 때 발생할 수 있는 성능저하를 예방하기 위해 추가적인 관계를 맺는 방법이 관계의 반정규화
  • 테이블과 칼럼의 반정규화는 데이터 무결성에 영향을 미치게 되나 관계의 반정규화는 데이터 무결성을 깨뜨릴 위험을 갖지 않고서도 데이터처리의 성능을 향상시킬 수 있음

정규화가 잘 정의된 데이터 모델에서 성능이 저하될 수 있는 경우

  • 아래 모델에서 공급자정보를 가져오는 경우를 가정해 보자.
  • 공급자와 전화번호, 메일주소, 위치는 1:M 관계이므로 한 명의 공급자당 여러 개의 전화번호, 메일주소, 위치가 존재
    • 따라서 가장 최근에 변경된 값을 가져오기 위해서는 조금 복잡한 조인이 발생
  • 모델을 아래와 같이 적절하게 반정규화를 적용하면 즉, 가장 최근에 변경된 값을 마스터에 위치시키면 간단하게 조회 가능 (성능 향상)

정규화가 잘 정의된 데이터 모델에서 성능이 저하된 경우

  • 아래와 같이 업무의 영역이 커지고 다른 업무와 인터페이스가 많아짐에 따라 데이터베이스서버가 여러 대인 경우를 가정해보자.
  • 서버A에 부서와 접수 테이블이 있고 서버B에 연계라는 테이블이 있는데 서버B에서 데이터를 조회할 때 빈번하게 조회되는 부서번호가 서버A에 존재하기 때문에 연계, 접수, 부서 테이블이 모두 조인이 걸리게 됨
    • 게다가 분산데이터베이스 환경이기 때문에 다른 서버간에도 조인이 걸리게 되어 성능이 저하됨
  • 다음과 같이 서버A에 있는 부서테이블의 부서명을 서버B의 연계테이블에 부서명으로 속성 반정규화 함으로써 조회 성능을 향상시킬 수 있음
profile
코드로 꿈을 펼치는 개발자의 이야기, 노력과 열정이 가득한 곳 🌈

0개의 댓글