1절. 성능 데이터 모델링의 개요
- 성능 데이터 모델링 : DB 성능향상을 위한 사항이 데이터 모델링에 반영되도록 하는 것
- 수행 시점
분석/설계 단계 → 모델링 시점이 늦어질수록 재업무 비용 증가. 데이터 증가가 빠를수록 성능저하에 따른 성능개선비용 증가분석/설계 단계에서 성능을 고려한 모델링을 수행할 경우 성능저하에 따른 Rework비용을 최소화할 수 있다. - 고려 사항 : 정규화 수행, DB 용량 산정과 트랜잭션 유형 파악을 통한 반정규화 수행, 정규화는 무조건 해야함!
- 순서 : 정규화 → DB용량산정 → 트랜잭션 유형 파악 → 반정규화 → 이력모델, PK/FK조정, 슈퍼/서브타입 조정 → 성능관점에서 검증 ★
2절. 정규화와 성능
- 정규화(Normalization) : 다양한 검사를 통해 데이터 모델을 구조화,개선하는 과정, 중복성, 이상현상(anomaly)제거
- 정규형(NF; Normal Form) : 정규화로 도출된 데이터 모델이 갖춰야 할 특성
- 함수적 종속성(FD; Functional Dependency) : 결정자와 종속자의 관계, 결정자의 값으로 종속자의 값을 알 수 있음
- 다치 종속(MVD; Multivalued Dependency) : 여러 칼럼이 동일한 결정자의 종속자일 때
- 정규화 이론
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. 절차
- 반정규화 대상 조사 (테이블, 속성, 관계)
- 자주 사용되는 테이블에 접근하는 프로세스의 수가 많고 항상 일정한 범위만을 조회하는 경우
- 대량의 데이터 범위를 자주 처리할때 처리범위를 일정하게 줄이지 않으면 성능을 보장할 수 없는 경우
- 통계성 프로세스에 의해 통계 정보를 필요로 할 때 별도의 통계테이블을 생성
- 테이블에 지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려운 경우
- 반정규화 정보에 대한 재현의 적시성으로 판단한다.
- 다른 방법 검토
- 지나치게 많은 조인이 걸려 데이터 조회가 어려울때 VIEW 사용
- 대량의 데이터처리나 부분처리에 의해 성능이 저하되는 경우 클러스터링을 적용하거나 인덱스를 조정
- 대량의 데이터는 PK의 성격에 따라 부분적인 테이블로 분리할 수 있다. (파티셔닝 기법)
- 응용 애플리케이션에서 로직을 구사하는 방법을 변경함으로써 성능 향상
- 이전 또는 이후 위치의 레코드에 대한 탐색은 Window function으로도 접근이 가능
- 집계 테이블에 국한하지 않고 이외에도 다양한 유형에 대하여 반정규화 테이블 적용이 필요할 수 있음
- 기법
테이블 반정규화 | 테이블 병합 | 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 : 파티션키와 인덱스키 동일, 파티션키와 인덱스키 구분
'Certificate > SQLD' 카테고리의 다른 글
[SQLD] 2과목 - 1장. SQL 기본 / 2장. WHERE (0) | 2022.11.07 |
---|---|
[SQLD]1과목 - 3장. DB 구조와 성능 (0) | 2022.11.07 |
[SQLD]1과목 - 1장 3절. 식별자 (0) | 2022.10.13 |
[SQLD]1과목 - 1장 2절. 엔터티, 속성, 관계 (0) | 2022.10.09 |
[SQLD]1과목 - 1장 1절. 데이터 모델링의 이해 (0) | 2022.10.06 |
댓글