2. 물리 데이터저장소 설계하기
2-1. 물리 데이터모델 설계
1) 반정규화(Denormalization) 개념
(1) 정의
정규화에 충실하여 모델링을 수행하면 종속성, 활용성은 향상되나 수행속도가 증가하는 경우가 발생하여 이를 극복하기 위해 성능에 중점을 두어 정규화하는 방법
(2) 특징
- 데이터 모델링 규칙에 얽매이지 않고 수행한다.
- 시스템이 물리적으로 구현되었을 때 성능향상을 목적으로 한다.
(3) 사용 시기
- 정규화에 충실하였으나 수행속도에 문제가 있는 경우
- 다량의 범위를 자주 처리해야 하는 경우
- 특정범위의 데이터만 자주 처리하는 경우
- 처리범위를 줄이지 않고는 수행속도를 개선할 수 없는 경우
- 요약 자료만 주로 요구되는 경우
- 추가된 테이블의 처리를 위한 오버헤드를 고려하여 결정
- 인덱스 조정이나 부분범위처리, 클러스터링 등으로 해결할 수 있는지 검토 후 결정
2) 반정규화(Denormalization) 유형
- 중복 테이블 추가
- 테이블 조합
- 테이블 분할
- 테이블 제거
- 칼럼의 중복화
2-2. 물리 데이터저장소 구성
1) 테이블 제약조건
(1) Delete Constraint
참조된 기본키의 값이 삭제될 경우의 처리내용을 정의
- Cascade: 참조한 테이블에 있는 외부키와 일치하는 모든 Row가 삭제된다.
- Restricted: 참조한 테이블에 있는 외부키에 없는 것만 삭제 가능하다.
- Nullify: 참조한 테이블에 정의된 외부키와 일치하는 것을 Null로 수정한다.
(2) Update Constraint
참조된 기본키의 값이 수정될 경우의 처리내용을 정의
- Cascade: 참조한 테이블에 있는 외부키와 일치하는 모든 Row가 수정된다.
- Restricted: 참조한 테이블에 있는 외부키에 없는 것만 수정가능하다.
- Nullify: 참조한 테이블에 정의된 외부키와 일치하는 것을 Null로 수정한다.(해당 칼럼이 Null을 허용할 경우만)
2) 인덱스 설계
(1) 인덱스 적용 기준
① 인덱스 칼럼의 분포도가 10 ~ 15% 이내인 경우
② 분포도가 범위 이상이더라도 부분처리를 목적으로 하는 경우
③ 입출력 장표 등에서 조회 및 출력 조건으로 사용되는 칼럼인 경우
④ 인덱스가 자동 생성되는 기본키와 Unique키의 제약조건을 사용할 경우
(2) 인덱스 칼럼 선정
① 분포도가 좋은 칼럼은 단독적으로 생성하여 활용도를 향상시킨다.
② 자주 조합되어 사용되는 칼럼은 결합 인덱스로 생성하여 활용한다.
③ 결합 인덱스는 구성되는 칼럼순서 선정(사용빈도, 유일성, Sort,...)에 유의해야 한다.
④ 가능한 한 수정이 빈번하지 않은 칼럼을 선정한다.
(3) 설계시 고려사항
① 새로 추가되는 인덱스가 기존 액세스 경로에 영향을 미칠 수 있음에 유의한다.
② 지나치게 많은 인덱스는 오버헤드로 작용한다.
③ 인덱스는 추가적인 저장공간이 필요함을 고려해야 한다.
④ 넓은 범위를 인덱스 처리 시 전체 처리보다 많은 오버헤드를 발생시킬 수 있음에 유의해야 한다.
⑤ 인덱스와 테이블 데이터의 저장 공간을 적절히 분리될 수 있도록 설계해야 한다.
3) 뷰 설계
(1) 뷰 속성
- REPLACE: 뷰가 이미 존재하는 경우 재생성
- FORCE: 기본 테이블의 존재 여부에 관계 없이 뷰 생성
- NOFORCE: 기본 테이블이 존재할 때 만 뷰 생성
- WITH CHECK OPTION: Sub-Query 내의 조건을 만족하는 행만 변경
- WITH READ ONLY: DML 작업 불가
(2) 뷰 설계 시 고려사항
- 최종적으로는 테이블을 액세스하는 것이므로 사용에 따라 수행속도에 문제가 발생할 수 있다.
- 뷰내의 SELECT 문의 조건은 가능한 한 최적의 액세스 경로를 사용할 수 있도록 하거나 그럴 수 없다면 뷰를 사용한 SQL의 WHERE 절에서는 반드시 양호한 액세스 경로가 되도록 하여야 한다.
4) 클러스터 설계
(1) 적용 기준
- 분포도가 넓을수록 오히려 유리(인덱스의 단점을 해결)한 기법
- 액세스 기법이 아니라 액세스 효율 향상을 위한 물리적 저장 방법
- 분포도가 넓은 테이블의 클러스터링은 저장 공간의 절약 가능
- 다중(일반적으로 6) 블록 이상의 테이블에 적용
- 대량의 범위를 자주 액세스하는 경우 적용
- 인덱스를 사용한 처리 부담이 되는 넓은 분포도에 활용
- 여러 개의 테이블이 번번히 조인을 일으킬 때 활용
- 반복 칼럼이 정규화에 의해 어쩔 수 없이 분할된 경우 활용
(2) 클러스터 설계시 고려사항
- 검색 효율은 높여 주나 입력, 수정, 삭제 시는 부하가 증가함을 고려하여야 한다.
- Union, Distinct, Order by, Group by가 빈번한 칼럼이면 고려해 보아야 한다.
- 수정이 자주 발생하지 않는 칼럼은 고려 대상이다.
- 처리 범위가 넓어 문제가 발생하는 경우는 단일 테이블 클러스터링을, 조인이 많아 문제가 발생되는 경우는 다중 테이블 클러스터링을 고려하여야 한다.
5) 파티션 설계
(1) 파티션 종류
- 범위분할(Range Partitioning): 지정한 열의 값을 기준으로 분할
- 해시분할(Hash Partitioning): 해시 함수에 따라 데이터를 분할
- 조합분할(Composite Partitioning): 범위분할에 의해 데이터를 분할한 다음 해시 함수를 적용하여 다시 분할
(2) 장점
- 데이터 액세스 범위를 줄여 성능 향상
- 전체 데이터의 훼손 가능성이 감소 및 데이터 가용성 향상
- 각 분할 영역을 독립적으로 백업하고 복구가능
- Disk Striping로 I/O 성능을 향상(Disk 컨트롤러에 대한 경합의 감소)
(3) 파티셔닝 순서
- 파티션의 종류 결정
- 파티션 키의 선정
- 파티션 수의 결정
6) 디스크 구성 설계
- 정확한 용량을 산정하여 디스크 사용의 효율을 높인다.
- 업무량이 집중되어 있는 디스크를 분리하여 설계함으로써 집중화된 디스크에 대한 입출력 부하를 분산한다.
- 입출력 경합을 최소화하여 데이터의 접근 성능을 향상시킨다.
- 시스템의 구성(Disk의 구성)에 따라 테이블스페이스의 개수와 사이즈 등을 결정한다.
- 파티션할 테이블은 별도로 분류한다.
참고자료 : https://www.ncs.go.kr