[SQLD 오답노트] 과목 2. 데이터 모델과 성능
■ 성능 데이터 모델링
- 데이터베이스 성능 향상을 목적으로 데이터 모델링 설계단계에서부터 성능과 관련된 사항이 데이터 모델링에 반영될 수 있도록 하는 것
= 데이터베이스 성능 향상을 위한 사항이 데이터 모델링에 반영되도록 하는 것
- 데이터 모델링 과정에서 모델의 구조가 변경될 수 있음
- 수행 시점: 분석/설계 단계 (성능 데이터 모델링 시점이 늦어질 수록 재업무 비용이 증가)
- 고려 사항: 정규화 수행, 데이터베이스 용량 산정과 트랜잭션 유형 파악을 통한 반정규화 수행
■ 성능 데이터 모델링 순서
1. 데이터 모델링을 할 때 정규화를 정확하게 수행한다.
2. 데이터베이스 용량산정을 수행한다.
3. 데이터베이스에 발생되는 트랜잭션의 유형을 파악한다.
4. 용량과 트랜잭션의 유형에 따라 반정규화를 수행한다.
5. 이력모델의 조정, PK/FK조정, 슈퍼타입/서브타입 조정 등을 수행한다.
6. 성능관점에서 데이터모델을 검증한다.
■ 정규화
- 1차 정규화
· 속성의 원자성 확복, 다중값 속성을 분리
- 2차 정규화
· 일부 기본키에만 종속된 속성을 분리 (기본키가 하나의 컬럼일 때 생략 가능)
· 부분 함수 종속성 제거
- 3차 정규화
· 서로 종속관계가 있는 일반 속성을 분리
· 이행 함수 종속성
- 보이스코드 정규화 (BCNK, Boyce-Code Normal Form)
· 후보키가 기본키 속성 중 일부에 함수적 종속일 때 다수의 주식별자를 분리
- 4차 정규화
· 다치 종속 분리
- 5차 정규화
· 결합 종속 분리
※ 1차, 2차, 3차, 보이스코드 정규화는 함수적 종속성에 근거
※ 4차 정규화는 다치 종속을 제거
※ 5차 정규화는 조인에 의한 이상현상을 제거
■ 2차 정규화 시 1:1 관계, 1:M 관계를 구분하는 법
- 2차 정규화는 주식별자 중 일부로부터 독립하는 경우가 다수
- 주식별자 중 일부로부터 독립했을 경우 1:M 관계가 됨
■ 반정규화
- 데이터를 중복하여 성능을 향상시키는 기법
- 성능을 향상시키기 위해 정규화된 데이터 모델에서 중복, 통합, 분리 등을 수행
- 데이터 무결성이 깨질 수 있는 위험을 무릅쓰고 데이터를 중복하여 조회 성능을 향상시키는 것
■ 반정규화 기법
- 테이블 반정규화
기법분류 | 반정규화 기법 | 설명 |
테이블 병합 | 1:1 관계 테이블 병합 | 업무 프로세스 상 JOIN이 필요한 경우가 많아 테이블을 통합하는 것이 성능 측면에서 유리할 경우 고려 ※ 1:M 관계 테이블 병합의 경우 1쪽에 해당하는 엔터티의 속성 개수가 많으면 병합했을때 중복 데이터가 많아지기 때문에 테이블 병합에 적절하지 못함 |
1:M 관계 테이블 병합 | ||
슈퍼/서브타입 테이블 병합 | ||
테이블 분할 | 수직분할 | 엔터티의 일부 속성을 별도의 엔터티로 분할 (1:1 관계 성립) 자주 사용하는 속성이 아니거나 대부분의 인스턴스가 해당 속성값을 NULL로 가지고 있을 때 고려 |
수평분할 | 엔터티의 인스턴스를 특정 기준으로 별도의 엔터티로 분할 파티션 기능 사용 (파티셔닝) |
|
테이블 추가 | 중복 테이블 추가 | 성능상 반드시 필요하다고 판단되는 경우 별도의 엔터티를 추가 |
통계 테이블 추가 | 계산한 값(통계치)를 미리 계산하여 저장한 엔터티를 추가 | |
이력 테이블 추가 | 이력 데이터를 저장하는 엔터티를 추가 | |
부분 테이블 추가 | 데이터가 다량으로 생기는 경우 필요한 정보만 부분 테이블로 생성 전체 컬럼 중 자주 이용하는 집중화된 컬럼들을 별도로 모아 놓는 기법 |
- 컬럼 반정규화
반정규화 기법 | 설명 |
중복 컬럼 추가 | 업무 프로세스 상 JOIN이 필요한 경우가 많아 컬럼을 추가하는 것이 성능상 유리할 경우 고려 JOIN 감소를 위해 여러 테이블에 동일한 컬럼을 갖도록 하는 것 |
파생 컬럼 추가 | 프로세스 수행 시 부하가 염려되는 계산값을 미리 컬럼으로 추가하여 보관하는 방식 조회 성능을 우수하게 하기 위해 미리 계산된 컬럼을 갖도록 하는 것 |
이력 테이블 컬럼 추가 | 이력 테이블을 조회할 때 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가해 놓는 방식 최신값을 처리하는 이력의 특성을 고려하여 기능성 칼럼을 추가하는 것 ex) 최신 데이터 여부 |
PK에 의한 컬럼 추가 | PK의 종속자를 일반속성으로 생성 |
■ 컬럼수가 많은 테이블 반정규화 방법
한 테이블에 많은 컬럼들이 존재할 경우 데이터가 물리적으로 저장되는 디스크 상에 넓게 분포할 가능성이 커짐 → 디스크 I/O가 대량으로 발생 → 성능 저하
트랜잭션이 접근하는 컬럼 유형을 분석 → 접근 빈도가 높은 컬럼과 접근 빈도가 낮은 컬럼을 구분하여 1:1로 테이블을 분리 → 디스크 I/O가 줄어듦 → 성능 향상
데이터가 채워지지 않고 주로 NULL 샅애로 존재하는 컬럼들을 뒤 쪽에 위치시키는 경우 로우의 길이를 어느정도 감소시킬 수 있으나, NULL 상태이던 컬럼에 나중에 데이터가 채워지게 될 경우 더 많은 로우체인이 발생할 수 있음
데이터가 NULL로 상태로 존재하는 컬럼이 많이 나타나는 경우는 너무 많은 엔터티들에 무리하게 동질성을 부여하여 통합을 수행했거나, 예측하기 어려운 미래 시점을 겨냥하여 과도하게 속성을 확장한 경우 등에서 주로 나타남
현시점에서 주로 사용되는 컬럼들을 한데 모으고, 사용빈도가 낮은 컬럼들이나 미래 시점에 사용 될 것으로 예상되는 나머지 컬럼들을 한데 모아 별도의 1:1 관계 엔터티로 분리하는 것이 좋음
■ 슈퍼/서브 타입 데이터 모델의 변환기술
- 개별로 발생되는 트랜잭션에 대해서는 개별 테이블로 구성
- 슈퍼타입 + 서브타입에 대해 발생되는 트랜잭션에 대해서는 슈퍼타입 + 서브타입 테이블로 구성
- 전체를 하나로 묶어 트랜잭션이 발생할 때는 하나의 테이블로 구성
■ PK 인덱스 (PK/FK 컬럼 순서 조절을 통한 성능 향상)
- 인덱스는 값의 범위에 따라 일정하게 정렬
→ 상수값으로 EQUAL 조건으로 조회되는 컬럼이 가장 앞으로 나오고 범위조회 하는 유형의 컬럼이 그 다음에 오도록 하는 것이 인텍스 액세스 범위를 좁힐 수 있는 가장 좋은 방법
- '='로 들어온 조건에 해당하는 컬럼이 인덱스의 가장 앞쪽에 위치할 때 인덱스의 이용 효율성이 가장 높음
- 등호 조건이나 BETWEEN 조건이 걸리는 컬럼을 앞으로 이동, 등호 조건을 가장 앞으로 이동
■ 분산 데이터베이스
- 분산된 데이터베이스를 하나의 가상 시스템으로 사용할 수 있도록 한 데이터베이스
→ 물리적 사이트는 분산되어 있으나 논리적으로 동일한 시스템
- 설계 방식
· 상향식: 지역 스키마 작성 후 전역 스키마 작성
· 하향식: 전역 스키마 작성 후 지역 스키마 작성
- 장점
· 지역 자치성, 점증적 시스템 용량 확장
· 신뢰성과 가용성
· 효용성과 융통성
· 빠른 응답 속도와 통신비용 절감
· 데이터의 가용성과 신뢰성 증가
· 시스템 규모의 적절한 조절
· 각 지역 사용자의 요구 수용 증대
- 단점
· 소프트웨어 개발 비용
· 오류의 잠재성 증대
· 처리 비용의 증대
· 설계, 관리의 복잡성과 비용
· 불규칙한 응답 속도
· 통제의 어려움
· 데이터 무결성에 대한 위협
- 분산 데이터베이스 적용 기법
· 테이블 위치 분산: 설계된 테이블의 위치를 분산
· 테이블 분산 분할: 테이블을 쪼개서 분산 (수평분할/수직분할)
· 테이블 복제 분산: 동일한 테이블을 다른 지역이나 서버에 동시 생성 (부분복제/광역복제)
· 테이블 요약 분산
· 분석요약: 사이트 별 요약정보를 본사에서 통합하여 전체 요약정보 산출
· 통합요약: 사이트 별 정보를 본사에서 통합하여 전체 요약정보 산출
※ Global Single Instance(GSI)
- 통합된 한 개의 인스턴스 즉, 통합 데이터베이스 구조를 의미
- 분산 데이터베이스와 대치되는 개념