Notice
Recent Posts
Recent Comments
05-13 16:06
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

-

[SQLD] #008 데이터 모델과 성능 - 반정규화와 성능 본문

SQLD

[SQLD] #008 데이터 모델과 성능 - 반정규화와 성능

choiht 2021. 4. 21. 16:18
반응형

목차

1. 반정규화를 통한 성능향상 전략

2. 반정규화의 기법

3. 정규화가 잘 정의된 데이터 모델에서 성능이 저하될 수 있는 경우

4. 정규화가 잘 정의된 데이터 모델에서 성능이 저하된 경우

 

 

 


 

1. 반정규화를 통한 성능향상 전략

1. 반정규화의 정의

반정규화 : 정규화된 엔터티, 속성, 관계에 대해 시스템의 성능향상과 개발 및 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링의 기법

 

데이터 무결성이 깨질 수 있는 위험을 감안하고 데이터를 중복하여 반정규화를 하는 이유는 데이터를 조회할 때 디스크 I/O 양이 많아서 성능이 저하되거나 경로가 너무 멀어 조인으로 인한 성능 저하가 예상되는 경우에 실행한다. 

 

정규화는 입력/수정/삭제/조회에 대한 성능을 향상시킨다. 그러나 정규화만을 수행하면 엔터티의 개수가 증가하고, 관계가 많아져 여러개의 조인이 걸려야만 데이터를 가져오는 경우가 있다. 또한 함수적 종속관계는 위반하지 않지만 데이터의 중복성을 증가시켜야만 데이터 조회의 성능을 향상키시는 경우도 있다. 

이러한 경우에 반정규화를 하게 된다. 

 

 

반정규화를 기술적으로 수행하지 않는 경우

- 성능이 저하된 DB가 생성될 수 있다.

- 구축 단계나 시험 단계에서 반정규화를 적용할 때 수정에 따른 노력 비용이 많이 든다. 

 

 

 

 

 

 

2. 반정규화의 적용방법

반정규화를 하면 데이터 무결성이 깨질 가능성이 크기 때문에 반드시 데이터 무결성을 보장할 수 있는 방법을 고려한 후 적용한다. 

정규화만을 강조하면 성능의 이슈가 발생할 수 있고, 반정규화만을 강조하면 데이터 무결성이 깨질 수 있다. 

 

 

 

반정규화는 위 그림과 같은 순서대로 적용된다.

 

1. 반정규화의 대상을 조사한다. 

- 자주 사용되는 테이블에 접근하는 프로세스의 수가 많고, 항상 일정한 범위만 조회하는 경우

- 테이블에 대량의 데이터가 있고 대량의 데이터 범위를 자주 처리하는 경우

- 통계성 프로세스에 의해 통계 정보를 필요로 할 때 별도의 통계 테이블 (반정규화 테이블)을 생성한다.

- 테이블에 지나치게 많은 JOIN이 걸려 데이터를 조회하는 작업이 어려울 경우

 

 

2. 반정규화의 대상에 대해 다른 방법으로 처리할 수 있는지 검토한다. 

- 많은 JOIN이 걸린 경우 : 뷰를 사용하면 이를 해결할 수도 있다.

뷰가 성능을 향상시키지는 않지만 개발자가 뷰를 통해 접근하게 함으로써 성능저하의 위험을 예방할 수 있다. 

 

- 대량의 데이터 처리로 인해 성능이 저하된 경우 : 클러스터링을 적용하거나 인덱스를 조정한다. 

클러스터링을 적용하는 방법은 대량의 데이터를 특정 클러스터링 팩트에 의해 저장 방식을 다르게 하는 방법이다. 이 방법은 데이터를 입력/수정/삭제하는 경우 성능이 많이 저하되므로 조회 중심의 테이블에만 적용한다. 

 

- 응용 애플리케이션에서 로직을 구사하는 방법을 변경함으로써 성능을 향상시킬 수 있다.

응용 메모리 영역에 데이터를 처리하기 위한 값을 캐시한다던지, 중간 클래스 영역에 데이터를 캐시해서 공유하게 하여 성능을 향상시킬 수도 있다. 

 

 

3. 반정규화를 적용한다.

반정규화를 적용해야겠다는 판단이 들었다면 세가지 규칙을 고려하여 적용한다. 반정규화는 테이블, 속성, 관계에 대해 적용할 수 있다. 

 

 

 

 

 

 

 

 

 

 

 

 

2. 반정규화의 기법

1. 테이블 반정규화

 

 

 

 

2. 칼럼 반정규화

 

 

 

 

3. 관계 반정규화

테이블과 칼럼의 반정규화는 데이터 무결성에 영향을 미치나 관계의 반정규화는 데이터 무결성을 깨뜨릴 위험을 갖지 않고서도 데이터처리의 성능을 향상시킬 수 있는 기법이 된다. 

데이터 모델 전체가 관계로 연결되어 있고 관계가 서로 먼 친적간에 조인관계가 빈번하다면 관계의 반정규화를 적용할 수 있다. 

 

 

 

 

 

 

 

 

 

 

3. 정규화가 잘 정의된 데이터 모델에서 성능이 저하될 수 있는 경우

아래 그림은 '공급자'라고 하는 엔터티가 마스터이고 전화번호와 메일 주소 위치가 각각 변경되는 내용이 이력형태로 관리되는 데이터 모델이다. 

이 모델에서 공급자 정보를 가져오는 경우를 가정하자. 공급자와 전화번호, 메일주소, 위치는 1:M 관계이므로 한명의 공급자당 여러개의 전화번호, 메일주소, 위치가 존재한다. 따라서 가장 최근에 변경된 값을 가져오기 위해서는 복잡한 JOIN이 발생한다.

 

하지만 위의 모델에 반정규화를 적용하면, 즉 가장 최근에 변경된 값을 마스터에 위치시키면 간단해진다. 

 

 

 

 

 

 

 

 

 

 

 

 

4. 정규화가 잘 정의된 데이터 모델에서 성능이 저하된 경우

서버 A에 부서와 접수 테이블이 있고 서버 B에 연계라는 테이블이 있는데, 서버 B에서 데이터를 조회할 때 빈번하게 조회되는 부서번호가 서버 A에 존재하기 때문에 연계, 접수, 부서 테이블이 모두 조인이 걸린다. 또한 분산 데이터베이스 환경이기 때문에 다른 서버간에도 조인이 걸려서 성능이 저하된다. 

 

하지만 아래 그림과 같이 서버 A 부서 테이블의 부서명을 서버 B의 연계테이블에 부서명으로 속성 반정규화를 함으로써 조회 성능을 향상시킬 수 있다. 

 

 

 

 

 


출처
이 글의 내용은 모두 한국데이터베이스진흥원이 출판한 SQL 전문가 가이드 2013 Edition을 기본으로 한다.

반응형
Comments