DataEdit

[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

http://www.gurubee.net/lecture/2360

http://www.gurubee.net/lecture/2361

'자격증 > 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

활동하기