본문 바로가기
Certificate/SQLD

[SQLD]1과목 - 2장. 데이터 모델과 성능

by Istj_eff 2022. 11. 7.

1절. 성능 데이터 모델링의 개요

  • 성능 데이터 모델링 : DB 성능향상을 위한 사항이 데이터 모델링에 반영되도록 하는 것
  • 수행 시점
    분석/설계 단계모델링 시점이 늦어질수록 재업무 비용 증가. 데이터 증가가 빠를수록 성능저하에 따른 성능개선비용 증가분석/설계 단계에서 성능을 고려한 모델링을 수행할 경우 성능저하에 따른 Rework비용을 최소화할 수 있다.
  • 고려 사항 : 정규화 수행, DB 용량 산정과 트랜잭션 유형 파악을 통한 반정규화 수행, 정규화무조건 해야함!
  • 순서 : 정규화 DB용량산정 트랜잭션 유형 파악 반정규화 이력모델, PK/FK조정, 슈퍼/서브타입 조정 성능관점에서 검증 ★

2절. 정규화와 성능

  1. 정규화(Normalization) : 다양한 검사를 통해 데이터 모델을 구조화,개선하는 과정, 중복성, 이상현상(anomaly)제거
    • 정규형(NF; Normal Form) : 정규화로 도출된 데이터 모델이 갖춰야 할 특성
  2. 함수적 종속성(FD; Functional Dependency) : 결정자와 종속자의 관계, 결정자의 값으로 종속자의 값을 알 수 있음
    • 다치 종속(MVD; Multivalued Dependency) : 여러 칼럼이 동일한 결정자의 종속자일 때
  3. 정규화 이론
    1) 1, 2, 3차, 보이스코드 정규화는 함수적 종속성에 근거
    2) 4차 정규화는 다치 종속을 제거
    3) 5차 정규화는 조인에 의한 이상현상을 제거하여 정규화를 수행함

 

  • 1차 정규화
    • 칼럼에 의한 반복, 중복적인 속성값을 갖는 형태는 1차 정규화 대상임.
    • 속성이 원자값을 갖도록함
    • 다중값 속성을 분리, 중복값 제거
    • 새로운 테이블 추가(PK추가)
    • 1:M관계형성
  • 2차 정규화
    • 기본키가 2개 이상의 속성일 때 “부분 함수 종속성” 제거
    • 일부 기본키에만 종속된 속성을 분리함 (1정규화 결과로 기본키가 하나일 때, 칼럼 한 개일 때 생략 가능)

 

설명 : 기본키 '관서번호', '납부자번호'2개 이상이므로, 이를 복합키라고 한다.
복합키 일부분에 종속되는 속성이 있으므로, 이를 구분하여 분리해준다.

 

 

 

 

 

  • 3차 정규화
    • 기본키가 아니라, 일반 컬럼에 의존하는 컬럼이 있으면 제거
    • “이행 함수 종속성“ 제거
    • 서로 종속관계가 있는 일반속성을 분리함, 주식별자와 관련성이 가장 낮음

 

설명 : 직원 테이블에 기본키인 사원번호외에 의존하는 컬럼이 있음. 부서코드와 부서이름은 부서테이블에 속함.

 

 

 

 

 

 

  • 보이스코드 정규화(BCNF; Boyce-Codd Normal Form) : 복잡한 식별자 관계에 의한 문제해결을 위해 3차 보완모든 결정자가 후보키( 후보키가 아닌 것들을 제외 및 분리)
  • 4 정규화, 5 정규화 : 다치 종속 분리, 결합 종속 분리
  • 릴레이션에 속한 모든 속성의 도메인이 원자값(atomic value)으로만 구성되어 있으면 1정규형에 속한다.
  • 릴레이션이 제1정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전함수 종속되면 2정규형에 속한다.
    (정규화가 잘된 테이블일수록 결정자는 PK(기본키)로 한개이고 종속자가 여러개인 구조를 가진다.)

 

  • 정규화와 성능: 정규화는 입출력 데이터의 양을 줄여 성능을 향상시킴
  • 정규화로 인한 성능 향상 : 입력/수정/삭제 시 성능은 항상 향상됨
    • 유연성 증가 : High Cohesion & Loose Coupling 원칙에 충실해짐
    • 재활용 가능성 증가 : 개념이 세분화됨
    • 데이터 중복 최소화
  • 정규화로 인한 성능 저하 : 조회 시 처리 조건에 따라 성능 저하가 발생할 수도 있음
    데이터 조회 시 조인을 유발하여 CPU와 메모리를 많이 사용하게 됨
    • 반정규화로 해결 가능
    • 조인이 발생하더라도 인덱스를 사용하여 조인 연산을 수행하면 성능상 단점이 거의 없고, 정규화를 통해 필요한 인덱스의 수를 줄일 수 있음
    • 정규화를 통해 소량의 테이블이 생성된다면 성능상 유리할 수 있음

3절. 반정규화와 성능

반정규화(Denormalization)

💡정규화된 엔터티, 속성, 관계에 대해 시스템 성능 향상과 개발, 운영의 단순화를 위해 데이터 중복, 통합, 분리 등 수행, 데이터의 무결성을 희생하고 입력,수정,삭제 성능이 향상되며 조인 성능이 향상됨.

 

3-1. 절차

  1. 반정규화 대상 조사 (테이블, 속성, 관계)
    • 자주 사용되는 테이블에 접근하는 프로세스의 수가 많고 항상 일정한 범위만을 조회하는 경우
    • 대량의 데이터 범위를 자주 처리할때 처리범위를 일정하게 줄이지 않으면 성능을 보장할 수 없는 경우
    • 통계성 프로세스에 의해 통계 정보를 필요로 할 때 별도의 통계테이블을 생성
    • 테이블에 지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려운 경우
    • 반정규화 정보에 대한 재현의 적시성으로 판단한다.
  2. 다른 방법 검토
    • 지나치게 많은 조인이 걸려 데이터 조회가 어려울때 VIEW 사용
    • 대량의 데이터처리나 부분처리에 의해 성능이 저하되는 경우 클러스터링을 적용하거나 인덱스를 조정
    • 대량의 데이터는 PK의 성격에 따라 부분적인 테이블로 분리할 수 있다. (파티셔닝 기법)
    • 응용 애플리케이션에서 로직을 구사하는 방법을 변경함으로써 성능 향상
    • 이전 또는 이후 위치의 레코드에 대한 탐색은 Window function으로도 접근이 가능
    • 집계 테이블에 국한하지 않고 이외에도 다양한 유형에 대하여 반정규화 테이블 적용이 필요할 수 있음
  3. 기법
테이블 반정규화 테이블 병합 1:1 관계 테이블 병합  
1:N 관계 테이블 병합 많은 데이터 중복 발생
테이블 분할 수직 분할 / 수평 분할 칼럼 단위 / 행 단위 분할하여 I/O 감소
테이블 추가 중복 테이블 업무나 서버가 다를 때 중복 테이블 생성 (원격조인 제거)
통계 테이블  
이력 테이블  
부분 테이블 자주 이용하는 집중화된 칼럼들이 있을 때디스크 I/O를 줄이기 위해 반정규화
칼럼 반정규화 중복 칼럼 추가 조인 감소를 위해 여러 테이블에 동일한 칼럼 갖도록 함
파생 칼럼 추가 조회성능 향상을 위해 필요한 값을 미리 계산한 칼럼 추가
이력 테이블 칼럼 추가 최신값을 처리하는 이력의 특성을 고려해서 기능성 칼럼 추가
PK에 의한 칼럼 추가 PK의 종속자를 일반속성으로 생성
응용 시스템의 오작동을 위한 칼럼 추가
관계 반정규화 중복 관계 추가  

4절. 대용량 데이터에 따른 성능 : 테이블 반정규화 중 테이블 분할 관련

  • 블록 : 테이블의 데이터 저장 단위
  • 대량 데이터 발생으로 인한 현상 : 블록 I/O 횟수 증가 디스크 I/O 가능성 상승 (디스크 I/O 많을 시 성능 저하)
    • 로우 체이닝(Row Chaining) : 행 길이가 너무 길어 여러 블록에 걸쳐 저장됨 1:1 테이블 분리로 조회성능 향상
    • 로우 마이그레이션(Row Migration) : 수정된 데이터가 해당 블록이 아닌 다른 블록의 빈 공간에 저장되는 현상
  • 테이블 분할(반정규화 기법)
    수직분할(너무 많은 칼럼이 있는 경우, 칼럼 단위) / 수평분할(행 단위로 분할) I/O를 감소시킴
파티셔닝(Partitioning)
테이블 수평분할 기법,  데이터 조회 범위를 줄여 성능 향상
논리적으로는 하나의 테이블이지만 물리적으로 여러 데이터 파일에 분산 저장
  • Range Partition : 테이블이 날짜,숫자값으로 분리 가능, 영역별로 트랜잭션이 분리될 때 범위를 기준으로 분할
  • List Partition : 지점, 사업소 PK가 구성되있고, 대량의 데이터가 있는 경우 특정한 값을 기준으로 분할
  • Hash Partition : 해시 함수를 적용하여 분할, DBMS가 알아서 분할 관리, 데이터 위치를 알 수 없음
  • Composite Partition : 여러 파티션 기법을 복합적으로 사용하여 분할
  •  파티션 인덱스(Partition Index)
    • Global Index, Local Index : 여러 파티션에서 단일 인덱스 사용, 파티션 별로 각자 인덱스 사용
    • Prefixed Index, Non-Prefixed Index : 파티션키와 인덱스키 동일, 파티션키와 인덱스키 구분

 

댓글