[SQLD 정리]5DAY
by Bigdaditor과목 1 데이터 모델링의 이해
2장 데이터 모델과 성능
제 1절 성능 데이터 모델링의 개요
1. 성능 데이터 모델링의 정의
# 성능 데이터 모델링
- 데이터베이스 성능향상을 목적으로 설계단계의 데이터 모델링 때 부터 정규화, 반정규화, 테이블통합, 테이블분할, 조인구조, PK, FK등 여러가지 성능과 관련된 사항이 데이터 모델링에 반영될 수 있도록 하는 것이다.
2. 성능 데이터 모델링 수행시점
# 성능 데이터 모델링은 언제하면 좋은가?
- 사전에 할 수록 비용이 들지 않는다.
- 분석/설계단계에서 성능을 고려한 데이터 모델링을 수행하면 나중에 성능저하때문에 발생하는 재업무비용을 최소화할 수 있다.
- 비즈니스 처리에 핵심적인 트랜잭션이 있다면 프로젝트 초기에 운영환경에 대비한 테스트환경을 구축하고 트랜잭션을 발생시켜 실제 성능 테스트를 해봐야한다.
- 데이터 모델의 구조도 변경하면서 가장 적절한 구조인지를 검토하여 디자인하는 전략이 요구된다.
3. 성능 데이터 모델링 고려사항
# 일반적으로 성능 데이터 모델은 다음과 같은 프로세스로 진행하는 것이 데이터 모델링단계에서 성능을 충분히 고려할 수 있는 방안이 된다.
- 데이터 모델링을 할 때 정규화를 정확하게 수행한다.
- 데이터베이스 용량산정을 수행한다.
- 데이터베이스에 발생되는 트랜잭션의 유형을 파악한다.
- 용량과 트랜잭션 유형에 따라 반정규화를 수행한다.
- 이력모델의 조정, PK/FK 조정, 슈퍼타입/서브타입 조정 등을 수행한다.
- 성능관점에서 데이터 모델을 검증한다.
- 충분하게 성능이 고려되었는지도 체크리스트에 포함하여 검증을 수행한다.
제 2절 정규화와 성능
0. 정규화
# 정규화란 다양한 유형의 검사를 통해 데이터모델을 좀 더 구조화하고 개선시켜 나가는 절차에 관련된 이론이다.
정규화종류 | 정규화내용 |
1차 정규화 | # 복수의 속성값을 갖는 속성을 분리 |
2차 정규화 |
# 주식별자에 종속적이지 않은 속성을 분리 # 부분종속 속성을 분리 |
3차 정규화 |
# 속성에 종속적인 속성의 분리 # 이전 종속 속성을 분리 |
보이스-코드 정규화 | # 다수의 주식별자 분리 |
4차 정규화 | # 다가 종속 속성 분리 |
5차 정규화 | # 결합 종속일 경우는 두 개 이상의 N개로 분리 |
1. 정규화를 통한 성능 향상 전략
# 정규화를 하는 것은 기본적으로 데이터에 대한 중복성을 제거해주고 데이터가 관심사별로 모여있게 되므로 성능이 향상된다.
# 엔터티가 계속 발생되고 그에 따라 조인이 많이 발생하므로 이로 인해 성능이 저하되기도 하지만 이런 부분은 사례별로 유의하여 반정규화를 적용하는 전략이 필요하다.
# 정규화를 수행하면 항상 조회시 성능이 저하되는가?
- 처리조건에 따라서 조회성능이 향상될 수도 저하될 수도 있다.
- 정규화가 수행된 모델은 입력/수정/삭제할 때 일반적으로 반정규화된 테이블에 비해 처리성능이 향상된다.
2. 반정규화된 테이블 성능저하 사례
[ 사례1 ]
# 정부보관금관서원장 테이블에서 주 식별자를 구성하는 일부 속성인 '관서번호'에만 종속적인 속성들을 별도의 테이블로 분리함
# 조인이 발생하더라도 PK Unique Index를 이용할 수 있었기 때문에 성능저하는 아주 미미하다.
[ 사례2 ]
# 특정장소에 대해 매각일자를 찾아 매각내용을 조회하려면 100만 건의 데이터를 읽어 매각일자를 DISTINCT하여 매각일자별매각내역이 조인된다.
# 일자별매각물건테이블에서 주식별자를 구성하는 일부속성인 '매각일자'에만 종속적인 속성들을 별도의 테이블로 분리함
[ 사례3 ]
# 유형분류코드가 1~9까지의 속성으로 존재하며 각 속성마다 인덱스를 생성해줘야하는 문제가 발생
# 동일한 속성형식을 두 개이상의 속성으로 나열해서 반정규화한 경우에 해당
# 로우 단위의 중복도 1차 정규화대상이 되지만 컬럼단위의 중복도 1차 정규화의 대상이 된다.
# 유형을 관리하는 테이블을 별도로 만들고 해당 테이블의 PK인덱스 하나만으로도 성능이 향상될 수 있다.
3. 함수종속성에 근거한 정규화 수행필요
# 함수의 종속성은 데이터들이 어떤 기준값에 의해 종속되는 현상을 지칭한다.
# 기준값을 결정자, 종속되는 값을 종속자라고 한다.
# 함수의 종속성은 데이터의 근본적인 속성으로 정규화작업이나 각 오브젝트에 속성을 배치하는데 이 함수의 종속성을 이용한다.
제 3절 반정규화와 성능
1. 반정규화를 통한 성능향상 전략
가. 반정규화의 정의
# 반정규화는 정규화된 엔터티, 속성, 관계를 시스템의 성능향상 및 개발과 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링기법이다.
# 디스크 I/O량이 많아서 조회 시 성능이 저하되거나 테이블끼리의 경로가 너무 멀어서 조인으로 인한 성능저하가 예상되거나 컬럼을 계산하여 읽을 때 성능이 저하될 것이 예상되는 경우 반정규화를 수행하게 된다.
# 업무적으로 조회에 대한 처리성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 된다.
# 설계단계에서 반정규화를 적용하게 되며 반정규화 미수행시에는 다음과 같은 현상이 발생된다.
- 성능이 저하된 데이터베이스가 생성될 수 있다.
- 구축단계나 시험단계에서 반정규화를 적용할 때 수정에 따른 노력비용이 많이 든다.
나. 반정규화의 적용방법
# 반정규화에 대한 필요성이 결정되면 컬럼의 반정규화 뿐만 아니라, 테이블의 반정규화, 관계의 반정규화를 종합적으로 고려하여 적용해야한다.
# 반정규화는 막연하게 중복을 유도하는 것만을 수행하기 보다는 성능을 향상시킬 수 있는 다른방법을 고려하고 그 이후에 반정규화를 적용하도록 해야한다.
# 반정규화 대상을 조사한다.
- 자주 사용되는 테이블에 엑세스하는 프로세스의 수가 가장 많고 항상 일정한 범위만을 조회하는 경우에 반정규화를 검토한다.
- 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우, 성능을 보장할 수 없는 경우에 반정규화를 검토한다.
- 테이블에 지나치게 조인을 많이 하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우 반정규화를 검토한다.
# 반정규화의 대상에 대해 다른 방법으로 처리할 수 있는 지 검토한다.
- 테이블에 많은 조인하여 데이터를 조회하는 것이 기술적으로 어려운 경우 View를 검토한다. 조회성능을 향상 시키지는 않지만 SQL작성의 미숙함으로 인하여 생기는 성능저하를 예방할 수 있다.
- 대량의 데이터처리나 부분처리에 의해 성능이 저하되는 경우 클러스터링을 적용하거나 인덱스 조정을 통해 성능을 향상 시킬 수 있다.
- 대량의 데이터는 PK의 성격에 따라 파티셔닝 기법을 적용하여 성능저하를 방지 할 수 있다.
- 어플리케이션에서 로직을 구현하는 방법을 변경하므로써 성능을 향상 시킬 수 있다.
# 반정규화를 적용한다.
- 반정규화 대상으로는 테이블, 속성, 관계에 대해 적용할 수 있으며 중복을 통한 방법만이 반정규화가 아니고 테이블, 속성, 관계를 추가/분할/제거할 수도 있다.
2. 반정규화의 기법
가. 테이블 반정규화
기법분류 | 기법 | 내용 |
테이블 병합 | 1:1 관계 테이블 병합 | # 1:1관계를 통합하여 성능향상 |
1:M 관계 테이블 병합 | # 1:M관계를 통합하여 성능향상 | |
슈퍼/서브타입 테이블 병합 | # 슈퍼/서브 관계를 통합하여 성능향상 | |
테이블 분할 | 수직 분할 |
# 컬럼단위의 테이블을 디스크 I/O를 분산처리하기 위해 테이블을 1:1로 분리하여 성능향상 # 트랜잭션의 처리되는 유형파악이 선행되어야함 |
수평 분할 |
# 로우단위로 집중 발생되는 트랜잭션을 분석하여 디스크 I/O 및 데이터 접근의 효율성을 높여 성능을 향상하기 위해 로우단위로 테이블을 쪼갬 # 관계가 없음 |
|
테이블 추가 | 중복테이블 추가 | # 다른 업무이거나 서버가 다른 경우 동일한 테이블구조를 중복하여 원격조인을 제거하여 성능을 향상 |
통계테이블 추가 | # SUM, AVG 등을 미리 수행하여 계산해 둠으로써 조회 시 성능을 향상 | |
이력테이블 추가 | # 이력테이블 중에서 마스터 테이블을 존재하는 레코드를 중복하여 이력테이블에 존재하는 방법 | |
부분테이블 추가 | # 하나의 테이블을 전체 칼럼 중 자주 이용하는 집중화된 컬럼이 있을 경우, 디스크 I/O를 줄이기 위해 해당 칼럼들을 모아놓은 별도의 반정규화된 테이블을 생성 |
나. 컬럼 반정규화
반정규화 기법 | 내용 |
중복컬럼 추가 | # 조인 시 성능저하를 예방하기 위해 중복된 컬럼을 위치시킴 |
파생컬럼 추가 | # 트랜잭션이 처리되는 시점에 계산에 의해 발생되는 성능저하를 예방하기 위해 미리 계산하여 컬럼에 보관 |
이력테이블 컬럼추가 | # 대량의 이력데이터 처리 시 불특정 일 조회나 최근 값을 조회할 때 나타날 수 있는 성능저하를 예방하기 위해 기능성 컬럼을 추가함 |
PK에 의한 컬럼 추가 | # 복합의미를 갖는 PK를 단일속성으로 구성했을 때 발생되며 PK안에 데이터가 존재하지만 성능향상을 위해 일반속성으로 포함하는 방법 |
응용시스템 오작동을 위한 컬럼 추가 | # 업무적으로는 의미가 없으나 데이터 처리 시 오류로 인해 원래 값으로 복구하길 원하는 경우 이전 데이터를 임식적으로 중복보관하는 방법 |
다. 관계 비정규화
반정규화 기법 | 내용 |
중복관계 추가 | # 여러 경로를 거쳐 조인이 가능하지만 성능저하를 예방하기 위해 추가적인 관계를 맺는 방법 |
3. 정규화가 잘 정의된 데이터 모델에서 성능이 저하될 수 있는 경우
[ 사례1 ]
# 공급자 정보를 가져올 때, 최근의 전화번호/메일/위치정보를 가져오기 위해서는 복잡한 조인을 거쳐야함
# 공급자 테이블에 최근 변경된 전화번호, 메일주소, 위치컬럼을 반정규화하면 간단하게 정보를 조회할 수 있음
[ 사례2 ]
# 서버B에서 데이터를 조회할 때, 항상 부서명을 가져오기 위해서 서버A를 거쳐야 하므로 성능저하가 발생한다.
# 부서명을 서버B의 연계테이블에 반정규화함으로써 성능을 개선시킬 수 있다.
[출처]
http://www.gurubee.net/lecture/2359
'자격증 > SQLD' 카테고리의 다른 글
[SQLD 정리]7DAY (0) | 2019.11.15 |
---|---|
[SQLD 정리]6DAY (0) | 2019.11.12 |
[SQLD 정리]4DAY (0) | 2019.11.06 |
[SQLD 정리]3DAY (0) | 2019.11.05 |
[SQLD 정리]2DAY (0) | 2019.11.04 |
블로그의 정보
DataEdit
Bigdaditor