PART 1. 성능 데이터 모델링의 개요
✅ 성능 데이터 모델링
: DB 성능향상을 목적으로 설계 단계의 데이터 모델링 때부터 정규화, 반정규화, 테이블 통합, 테이블 분할, 조인구조, PK, FK 등 여러가지 성능과 관련된 사항이 데이터 모델링에 반영될 수 있도록 하는 것.
🔹 수행 시점
: 분석/설계 단계에서 데이터 모델에 성능을 고려한 데이터 모델링을 수행할 경우 성능 저하에 따른 재업무 비용을 최소화 할 수 있는 기회를 가지게 된다.
데이터의 증가가 빠를수록 성능 저하에 따른 성능개선비용은 기하급수적으로 증가하게 된다.
⚠️ 성능 데이터 모델링 시점이 늦어질수록 재업무 비용이 증가한다.
🔹 성능 데이터 모델링 고려사항 순서
- 데이터 모델링을 할 때 정규화를 정확하게 수행해야 한다.
- DB 용량산정을 수행한다.
- DB에 발생되는 트랜잭션의 유형을 파악한다.
- 용량과 트랜잭션의 유형에 따라 반정규화를 수행한다.
- 이력 모델의 조정, PK/FK 조정, 슈퍼/서브타입을 조정해야 한다.
- 성능 관점에서 데이터 모델을 검증한다.
→ 기본적으로 데이터는 속성간의 함수종속성에 근거하여 정규화되어야 한다. 정규화는 선택이 아니라 필수사항이다.
🔹 함수적 종속성 (FD, Functional Dependency)
- 데이터들이 어떤 기준 값에 의해 종속되는 현상
- 결정자와 종속자의 관계이다.
- 결정자의 값으로 종속자의 값을 알 수 있다.
✔️ 다치 종속(MVD, Multivalued Dependency): 여러 컬럼이 동일한 결정자의 종속자일 때
PART 2. 정규화와 성능
✅ 정규화 (Normalization)
: 반복적인 데이터를 분리하고 각 데이터가 종속된 테이블에 적절하게 배치되도록 하는 것.
컬럼에 의한 반복, 중복적인 속성 값을 갖는 형태는 1차 정규화의 대상이다.
이상형상(anomaly)를 제거한다.
✔️ 정규형 (NF, Normal Form): 정규화로 도출된 데이터 모델이 갖춰야 할 특성
✅ 정규화 이론
- 1차, 2차, 3차, 보이스코드 정규화는 함수적 종속성에 근거한다.
- 4차 정규화는 다치 종속을 제거한다.
- 5차 정규화는 조인에 의한 이상현상을 제거하여 정규화를 수행한다.
🔹 1차 정규화
- 속성의 원자성을 확보한다.
- 다중값 속성을 분리한다.
🔹 2차 정규화
- 부분 함수 종속성을 제거한다.
- 일부 기본키에만 종속된 속성을 분리한다.
- 기본키가 하나의 컬럼일 때 생략 가능하다.
🔹 3차 정규화
- 이행 함수 종속성을 제거한다.
→ 기본키 이외에 다른 컬럼이 그 외에 다른 컬럼을 결정할 수 없다는 것을 의미한다.
- 서로 종속관계가 있는 일반속성을 분리한다.
- 주식별자와 관련성이 가장 낮다.
🔹 보이스코드 정규화(BCNF, Boyee-codd Normal Form)
- 후보키가 기본키 속성 중 일부에 함수적 종속일 때 다수의 주식별자를 분리한다.
→ 3차 정규화를 진행한 테이블에 대해 모든 결정자가 테이블을 분해하는 것
🔹 4차, 5차 정규화 : 다치 종속 분리, 결합 종속 분리
✅ 정규화와 성능
: 정규화는 입출력 데이터의 양을 줄여 성능을 향상시킨다.
🔹 정규화로 인한 성능 향상
: 입력 / 수정 / 삭제 시 성능은 항상 향상된다.
- 유연성 증가: High Cohesion & Coupling 원칙에 충실해진다.
- 응집도(Cohesion): 테이블 내부의 속성들이 얼마나 하나의 주제를 잘 나타내고 서로 밀접하게 관련되어 있는지를 의미한다.
→ 즉, 하나의 테이블이 얼마나 잘 정의된 단일 목적을 가지는지에 대한 척도이다.
- 결합도(Coupling): 테이블들이 서로 얼마나 강하게 의존하고 있는지를 나타낸다.
→ 외래키(Foreign Key)를 통한 참조 관계의 정도와 유형으로 평가될 수 있다.
- 재활용 가능성 증가: 개념이 세분화 된다.
- 데이터 중복 최소화
🔹 정규화로 인한 성능 저하
: 조회 시 처리 조건에 따라 성능 저하가 발생할 수도 있다.
- 데이터 조회 시 조인을 유발하여 CPU와 메모리를 많이 사용하게 된다.
- 반정규화로 해결 가능하다.
- 조인이 발생하더라도 인덱스를 사용하여 조인 연산을 수행하면 성능 상 단점이 거의 없고, 정규화를 통해 필요한 인덱스의 수를 줄일 수 있다.
- 정규화를 통해 소량의 테이블이 생성된다면 성능 상 유리할 수 있다.
PART 3. 반정규화와 성능
✅ 반정규화 (Denormalization)
: 정규화된 엔터티, 속성, 관계에 대해 시스템의 성능향상과 개발과 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링의 기법이다.
→ 일반적으로 정규화시 입력 / 수정 / 삭제 성능이 향상되며 반정규화시 조인 성능이 향상된다.
: 데이터 중복을 허용하여 조인을 중리는 DB 성능 향상 방법이다.
→ 데이터의 무결성을 희생하고 조회 성능을 향상시킨다.
✅ 반정규화 절차
🔹 반정규화 대상 조사 (데이터 처리 범위, 처리 빈도수, 통계성 등)
- 자주 사용되는 테이블에 접근하는 프로세스의 수가 많고 항상 일정한 범위만을 조회하는 경우
- 테이블의 대량의 데이터가 있고 대량의 데이터 범위를 자주 처리하는 경우에 처리범위를 일정하게 줄이지 않으면 성능을 보장할 수 없는 경우
- 통계성 프로세스에 의해 통계 정보를 필요로 할 때 별도의 통계 테이블을 생성한다.
- 테이블에 지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우
SORTING, ORDER BY는 반정규화 대상 ❌
🔹 다른 방법 유도 검토 (뷰, 클러스터링, 인덱스, 애플리케이션)
-
지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우 VIEW를 사용한다.
-
대량의 데이터처리나 부분처리에 의해 성능이 저하되는 경우 클러스터링을 적용하거나 인덱스를 조정한다.
✔️ 클러스터링(Clustering): 물리적인 저장 효율성과 조회(SELECT) 성능 향상을 목적으로 사용되는 기법.
물리적인 저장 구조를 변경하여 관련있는 데이터를 디스크 상에서 가깝게 배치함으로써 I/O(입출력) 효율을 높이는 전략.
-
대량의 데이터는 PK의 성격에 따라 부분적인 테이블로 분리할 수 있다. (파티셔닝 기법)
-
응용 애플리케이션에서 로직을 구사하는 방법을 변경함으로써 성능을 향상시킬 수 있다.
🔹 반정규화 적용 (정규화 수행 후 반정규화 수행 → 테이블, 속성, 관계 반정규화)
✅ 반정규화 기법(테이블, 컬럼, 관계)
🔶 테이블 반정규화
🔹 테이블 병합 ( 1:1 관계, 1:M 관계, 슈퍼/서브타입 )
- 1:1 관계를 통합하여 성능 향상
- 1:M 관계를 통합하여 성능 향상 - 많은 데이터 중복 발생
- 슈퍼/서브 관계를 통합하여 성능 향상
🔹 테이블 분할 ( 수직 분할, 수평 분할 )
- 수직 분할 : 컬럼 단위 테이블을 디스크 I/O를 분산처리하기 위해 테이블을 1:1로 분리하여 성능 향상
- 수평 분할 : 로우 단위로 집중 발생되는 트랜잭션을 분석하여 디스크 I/O 및 데이터 접근의 효율성을 높여 성능을 향상하기 위해 로우 단위로 테이블을 쪼갠다.
🔹 테이블 추가 ( 중복, 통계, 이력, 부분 테이블 추가 )
- 중복 : 다른 업무이거나 서버가 다른 경우 동일한 테이블 구조를 중복하여 원격 조인을 제거하여 성능을 향상시킨다.
- 통계 : SUM, AVG 등을 미리 수행하여 계산해 둠으로써 조회 시 성능을 향상시킨다.
- 이력 : 이력 테이블 중에서 마스터 테이블에 존재하는 레코드를 중복하여 이력 테이블에 존재시켜 성능을 향상시킨다.
- 부분 : 하나의 테이블의 전체 컬럼 중 자주 이용하는 집중화된 컬럼들이 있을 때 디스크 I/O를 줄이기 위해 해당 컬럼들을 모아놓은 별도의 반정규화된 테이블을 생성한다.
→ 즉, 자주 이용하는 컬럼으로 구성된 테이블을 생성한다.
🔶 컬럼 반정규화 ( 중복, 파생, 이력, PK, 오작동 )
- 중복 : 조인에 의해 처리할 때 성능저하를 예방하기 위해 중복된 컬럼을 위치시킨다.
- 파생 : 트랜잭션이 처리되는 시점에 계산에 의해 발생되는 성능저하를 예방하기 위해 미리 값을 계산하여 컬럼에 보관한다.
→ 즉, 필요한 값 미리 계산한 컬럼을 추가한다.
- 이력테이블 : 대량의 이력데이터를 처리할 때 불특정 날 조회나 최근 값을 조회할 때 나타날 수 있는 성능저하를 예방하기 위해 이력테이블에 가능성 칼럼(최근값 여부, 시작과 종료일자 등)을 추가한다.
- PK에 의한 컬럼 추가 : 이미 PK안에 데이터가 존재하지만 성능향상을 위해 일반속성으로 포함하는 방법
- 응용시스템 오작동을 위한 컬럼 추가 : 업무적으로는 의미가 없지만 사용자의 실수로 원래 값으로 복구하기 원하는 경우 이전 데이터를 임시적으로 중복하여 보관하는 기법이다.
🔶 관계 반정규화 : 데이터 무결성 보장 가능
- 중복관계 추가
: 데이터를 처리하기 위한 여러 경로를 거쳐 조인이 가능하지만 이 때 발생할 수 있는 성능저하를 예방하기 위해 추가적인 관계를 맺는 방법
PART 4. 대용량 데이터에 따른 성능
: 테이블 반정규화 중 테이블 분할 관련
🔹 블록 : 테이블의 데이터 저장 단위
✅ 대량 데이터 발생으로 인한 현상
: 블록 I/O 획수 증가 → 디스크 I/O 가능성 상승 (디스크 I/O시 성능 저하)
🔹 로우 체이닝 (Row Chaining)
: 로우의 길이가 너무 길어서 데이터 블록 하나에 데이터가 모두 저장되지 않고 두 개 이상의 블록에 걸쳐 하나의 로우가 저장되어 있는 형태
🔹 로우 마이그레이션 (Row Migration)
: 데이터블록에서 수정이 발생하면 수정된 데이터를 해당 데이터 블록에서 저장하지 못하고 다른 블록의 빈 공간을 찾아 저장하는 방식
→ 로우 체이닝과 로우 마이그레이션이 발생하여 많은 블록에 데이터가 저장되면 DB 메모리에서 디스크 I/O가 발생할 때 많은 I/O가 발생하여 성능저하 발생.
트랜잭션을 분석하여 적절하게 1:1관계로 분리함으로써 성능향상이 가능하도록 해야 한다.
✅ PK에 의해 테이블을 분할하는 방법 (파티셔닝)
🔹파티셔닝 (Partitioning)
: 테이블 수평분할 기법. 논리적으로는 하나의 테이블이지만 물리적으로 여러 데이터 파일에 분산 저장, 데이터 조회 범위를 줄여 성능 향상
- RANGE PARTITION : 대상 테이블이 날짜 또는 숫자 값으로 분리가 가능하고 각 영역별로 트랜잭션이 분리되는 경우
즉, 데이터 값의 범위를 기준으로 분할
PARTITION BY COL1
ORDER BY COL3
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
- LIST PARTITON : 지점, 사업소 등 핵심적인 코드값으로 PK가 구성되어 있고 대량의 데이터가 있는 테이블의 경우
즉, 특정한 값을 기준으로 분할
- HASH PARTITION : 지정된 HASH 조건에 따라 해시 알고리즘이 적용되어 테이블이 분리
즉, 해시 함수를 적용하며 분할, DBMS가 알아서 분할 관리, 데이터 위치를 알 수 없음
- COMPOSITE PARTITON : 여러 파티션 기법을 복합적으로 사용하여 분할
※ 파티션 인덱스 (Partition Index)
- Global Index, Local Index : 여러 파티션에서 단일 인덱스 사용, 파티션 별로 각자 인덱스 사용
- Prefixed Index, Non-Prefixed Index : 파티션키와 인덱스키 동일, 파티션키와 인덱스키 구분
✅ 테이블에 대한 수평/수직분할의 절차
- 데이터 모델링을 완성한다.
- DB 용량산정을 한다.
- 대량 데이터가 처리되는 테이블에 대해 트랜잭션 처리 패턴을 분석한다.
- 컬럼 단위로 집중화된 처리가 발생하는지, 로우 단위로 집중된 처리가 발생하는지 분석하여 집중화된 단위로 테이블을 분리하는 것을 검토한다.
PART 5. DB 구조와 성능
✅ 슈퍼타입 / 서브타입 데이터 모델 변환을 통한 성능 향상
🔹 슈퍼/서브 타입 모델
: 속성을 항당하여 배치하는 수평 분할된 형태의 모델(공통 속성은 슈퍼타입으로 모델링하고 차이가 있는 속성은 서브타입으로 구분됨), 변환을 통해
1) 정확하게 업무를 표현할 수 있고,
2) 물리적 모델링 시 선택의 폭을 넓힐 수 있다.
🔹 슈퍼/서브 타입 데이터 모델의 변환
- 슈퍼/서브타입에 대한 변환을 잘못하면 성능이 저하되는 이유
: 트랜잭션의 특성을 고려하지 않고 테이블을 설계했기 때문이다.
- 변환 기준 : 데이터 양, 트랜잭션 유형
- 트랜잭션은 항상 일괄로 처리하는데 테이블은 개별로 유지되어 Union 연산에 의해 성능이 저하될 수 있다.
- 트랜잭션은 항상 서브타입 개별로 처리하는데 테이블은 하나로 통합되어 있어 불필요하게 많은 양의 데이터가 집약되어 있어 성능이 저하되는 경우가 있다.
- 트랜잭션은 항상 슈퍼+서브 타입을 공통으로 처리하는데 개별로 유지되어 있거나 하나의 테이블로 집약되어 있어 성능이 저하되는 경우가 있다.
🔹 슈퍼/서브 타입 데이터 모델의 변환 기술
- 1:1 타입(OneToOne Type) : 개별로 발생되는 트랜잭션에 대해서는 개별 테이블로 구성한다.
슈퍼타입과 서브타입 각각 필요한 속성과 유형에 적합한 데이터만 가지도록 분리하여 1:1 관계를 갖도록 한다.
- 슈퍼/서브 타입(Plus Type) : 슈퍼타입과 서브타입을 공통으로 처리하는 트랜잭션에 대해 슈퍼타입과 서브타입 각각의 테이블로 구성한다.
- All in One 타입(Single Type) : 전체를 하나로 묶어 트랜잭션이 발생할 때는 하나의 테이블로 구성한다.
| 1:1 타입 | 슈퍼/서브 타입 | All in One 타입 |
|---|
| 특징 | 개별 테이블 유지 | 슈퍼/서브 타입 테이블 구성 | 단일 테이블 구성 |
| 트랜잭션 유형 | 개별 처리 | 슈퍼/서브 타입 공통 처리 | 일괄 처리 |
| 확장성 | 좋음 (테이블 추가 용이) | 보통 | 나쁨 |
| 조인 성능 | 나쁨 (조인 많이 필요) | 나쁨 (조인 많이 필요) | 좋음 |
| I/O 성능 | 좋음 | 좋음 | 나쁨 (항상 전체 데이터 조회) |
| 관리용이성 | 나쁨 | 나쁨 | 좋음 |
✅ PK/FK DB 성능 향상
🔹 컬럼 순서 조절을 통한 성능 향상
- 인덱스의 특징은 여러 개의 속성이 하나의 인덱스로 구성되어 있을 때 앞쪽에 위치한 속성의 값이 비교자로 있어야 좋은 효율을 나타낸다.
- 앞쪽에 위치한 속성의 값이 가급적 ‘=’ 아니면 최소한 범위 ‘BETWEEN’ ‘<>’가 들어와야 효율적이다.
→ 여러 조건이 있을 경우 등호 조건이 걸리는 컬럼을 선두로 이동
🔹 인덱스 특성을 고현한 성능 향상
- 물리적인 테이블에 FK 제약 걸었을 때는 반드시 FK 인덱스를 생성하도록 하고,
- FK 제약이 걸리지 않았을 경우에는 FK인덱스를 생성하는 것을 기본정책으로 하되,
- 발생되는 트랜잭션에 의해 겨의 활동되지 않았을 때에만 FK인덱스를 지우는 방법으로 하는 것이 적절한 방법이다.
→ FK에도 인덱스를 생성할 필요가 있다.
PART 6. 분산 DB 데이터에 따른 성능
✅ 분산 DB
- 분산된 DB를 하나의 가성 시스템을 사용할 수 있도록 한 DB
- 논리적으로 동일한 시스템에 속하지만, 컴퓨터 네트워크를 통해 물리적으로 분산되어 있는 데이터 집합
- 과거에는 위치 중심이었으나 현재는 업무 필요에 따라 분산 설계
🔹 설계 방식
- 상향식 : 지역 스키마 작성 후 전역 스키마 작성
- 하향식 : 전역 스키마 작성 후 지역사상 스키마 작성
🔹 분산 DB 장단점
- 장점
- 신뢰성과 가용성 증가
- 빠른 응답 속도와 통신비용 절감
- 용량 확장 용이
- 지역 자치성, 효율성, 융통성, 각 지역 사용자 요구 수용
- 단점
- 관리 및 통제 어려움
- 데이터 무결성 관리 어려움
- S/W 개발 비용 및 처리 비용 증가
- 불규칙한 응답 속도
- 오류의 잠재성 증대
✅ 분산 DB를 만족하기 위한 6가지 투명성 (분위지중장병행)
- 분할 투명성(단편화) : 하나의 논리적 Relation이 여러 단편으로 분할되어 각 사본이 여러 site에 저장된다.
- 위치 투명성 : 사용하려는 데이터의 저장 장소가 명시되지 않아도 된다.
위치 정보가 시스템 카탈로그에 유지된다.
- 지역사상 투명성 : 지역 DBMS와 물리적 DB 사이의 사상(Mapping)이 보장된다.
- 중복 투명성 : DB 객체가 여러 site에 중복 되어 있는지 알 필요가 없다.
- 장애 투명성 : 구성요소(DBMS, 컴퓨터)의 장애에 무관한 트랜잭션의 원자성이 유지된다.
- 병행 투명성 : 다수 트랜잭션 동시 수행시 결과의 일관성 유지된다.
병렬이 아니다.
TimeStamp, 분산 2단계 Locking 이용
✅ 분산 DB 적용 기법
- 테이블 위치 분산 : 설계된 테이블의 위치를 본사와 지사단위로 분산
- 테이블 분할 분산(Table Fragmentation) : 각각의 테이블을 쪼개어 분산
- 수평 분할: 로우 단위로 분리
- 수직 분할: 컬럼 단위로 분리
- 테이블 복제 분산(Table Replication)
: 동일한 테이블을 다른 지역이나 서버에서 동시에 생성하여 관리하는 유형
원격지 조인을 내부 조인으로 변경하여 성능을 향상시킨다.
- 부분복제: 마스터 DB에서 테이블의 내용만 다른 지역이나 서버에 위치
- 광역복제: 마스터 DB 테이블의 내용을 각 지역이나 서버에 존재
- 테이블 요약 분산(Table Summarization)
: 지역 간에 또는 서버 간에 데이터가 비슷하지만 서로 다른 유형으로 존재하는 경우
- 분석요약: 동일한 테이블 구조를 가지고 있으면서 분산되어 있는 동일한 내용의 데이터를 이용하여 통합된 데이터를 산출하는 방식
- 통합요약: 분산되어 있는 다른 내용의 데이터를 이용하여 통합된 데이터를 산출하는 방식
→ 다른 내용은 반드시 테이블 구조가 다르다는 이미뿐 아니라, 각 데이터가 다루는 업무 영역이나 의미가 다르다는 것을 포함할 수 있다.
✅ 분산 DB 설계를 고려해야 하는 경우
- 성능이 중요한 사이트
- 공통코드, 기준정보, 마스터 데이터의 성능 향상
- 실시간 동기화가 요구되지 않는 경우.
거의 실시간의 업무적인 특징을 가지고 있는 경우
- 특정 서버에 부하가 집중되어 부하를 분산
- 백업 사이트 구성하는 경우
GIS(Global Single Instance)는 통합데이터 구조