제 2절 정규화와 성능
1. 정규화를 통한 성능 향상 전략
데이터 모델링을 하면서 정규화를 하는 것은 기본적으로 데이터에 대한 중복성을 제거해주고 데이터가 관심사별로 처리되는 경우가 많기 때문에 성능이 향상되는 특징을 가지고 있다. 물론 조인이 많이 발생하여 성능저하가 나타나는 경우도 있지만 이런 부분은 사례별로 유의하여 반정규화를 해야한다.
정규화를 수행한다는 것은 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반 속성을 의존자로 하여 입력/수정/삭제 이상을 제거하는 것이다. 데이터의 중복속성을 제거하고 결정자에 의해 동일한 의미의 일반속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화 되는 효과가 있다.
따라서 정규화된 테이블은 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수 도 있는 특성이 있다. 기업에서 일을 할 때 정규화는 선택조건이 아닌 필수조건이기 때문에 이를 잘 고려하여 정규화를 수행해야 한다.
정규화가 잘 되어 있다면 입력 / 수정 / 삭제의 성능이 향상되고 반정규화를 많이 하게 되면 조회의 성능이 향상이 된다고 인식할 수 있는데 반정규화를 해서 성능이 나빠질 수 있다는 것도 유의를 해야 한다. 꼭 좋아지는게 아니다. 또한 정규화를 한다고 해서 성능이 저하된다는 고정관념도 버려야 한다. 정규화를 해야만 성능이 향상되는 경우도 많이 있다.
2. 반정규화된 테이블의 성능저하 사례1
정규화를 하여 조인이 발생하게 되면 성능이 심각하게 저하되는가 ? 다음 예시에서는 2차 정규화를 적용한 테이블에 대해서 조인을 하더라도 PK Unique Index를 이용하면 조인 성능 저하는 미미하게 발생된다.
위의 예시에서 보면, 왼쪽 그림은 2차 정규화가 안 된 반 정규화 된 테이블의 모습이고 오른쪽 그림은 부분키종속을 정규화 하여 두 개의 테이블로 분리해 2차 정규화된 테이블의 모습이다.
왼쪽 그림에서는 직급명과 함께 관서번호, 관서명을 조회하게 되면 하나의 테이블에서 모든 조회가 이루어지게 된다.
오른쪽 그림에서는 관서번호, 관서명이 관서테이블에만 존재하기 때문에 두 개의 테이블을 조인하여 처리해야한다. 정부보관금관서원장에서 데이터를 조회하는 것이나, 관서와 정부보관금관서원장을 조인하여 데이터를 조회하나 성능은 거의 차이가 나지 않는다. PK가 걸려있는 방향으로 조인이 걸려 Unique Index를 곧바로 찾아서 데이터를 조회하기 때문에 미미하게 성능차이가 나기 때문에 성능이 저하 될 일이 별로 없다.
또한 관서등록일자가 2010년 이후 관서를 모두 조회하라는 SQL 구문을 처리한다고 할 때 오른쪽 그림(2차 정규화 완료)이 훨씬 빠르게 수행 될 수 있다. 왼쪽 테이블에서는 불필요하게 납부자 번호 만큼 누적된 데이터를 읽어 결과를 구분해 보여줘야 하지만 오른쪽 테이블은 관서수만큼 존재하는 데이터를 읽어 곧바로 결과를 보여주기 때문이다.
그렇기 때문에 정규화를 수행하면 무조건 조회성능이 저하된다는 고정관념은 틀렸다는 것을 알려줄 수 있다. 뿐만아니라 다른 예시도 알아보자..
3. 반정규화된 테이블의 성능저하 사례2
두 개의 엔티티가 통합되어 반정규화된 또 다른 경우를 살펴보도록 하자.
이 업무에서는 어떤 물건을 매각할 때 매각일자를 정하고 이 매각일자에 따라서 매각시간과 매각장소가 결정되는 속성을 가지고 있다고 하자. 즉, 매각일자가 결정자고 매각시간과 매각장소가 의존자가되는 함수적 종속관계를 가지고 있다.
'서울 7호'라는 장소에서 매각된 총 매각금액, 총유찰금액을 산출하는 SQL 문장은 다음과 같다.
SELECT B.총매각금액, B.총유찰금액
FROM (SELECT DISTINCT 매각일자 FROM 일자별매각물건 WHERE 매각장소 = '서울 7호') A,
매각일자별매각내역 B
WHERE A.매각일자 = B.매각일자
AND A.매각장소 = B매각장소;
이는 대량의 데이터에서 조인 조건이 되는 대상을 찾기 위해 인라인 뷰를 사용하기 때문에 성능이 저하된다.
이를 정규화하려면 복합식별자 중에서 일반속성이 주식별자 속성 중 일부에만 종속관계를 가지고 있으므로 2차 정규화의 대상이 된다.
2차 정규화를 적용한 모델은 다음과 같다.
2차 정규화를 수행하여 매각일자를 PK로 하고 매각시간과 매각속성은 일반속성으로 두었다.
정규화를 적용했기 때문에 매각일자를 PK로 사용하는 매각일자별매각내역과도 관계가 연결된다.
위 모델에서 아까 조회하였던 SQL 문장을 작성해보면
SELECT B.총매각금액, B.총유찰금액
FROM 매각기일 A, 매각일자별매각내역 B
WHERE A.매각장소 = '서울 7호'
AND A.매각일자 = B.매각일자
AND A.매각장소 = B.매각장소
이렇게 데이터를 조회하게 되면 조회된 데이터가 줄어들어 조회처리가 빨라지게 된다.
4. 반정규화된 테이블의 성능저하 사례3
다음 사례는 동일한 속성 형식을 두 개 이상의 속성으로 나열하여 반정규화한 경우에 해당한다. 계층형 데이터베이스를 많이 사용했던 과거 데이터 모델링의 습관이 남아서인지 관계형 데이터베이스에서도 동일한 속성을 한 테이블에 속성1, 속성2, 속성3 데이터 모델링을 하는 경우가 많이 있다.
아래와 같은 그림을 보면 테이블에 업무적으로 필요한 8개의 인덱스가 이미 생성되어있다. 유형기능분류코드에 따라 데이터를 조회하는 경우가 많이 나타나 인덱스를 생성하려면 유형기능분류코드 각각에 대해 인덱스를 생성해야 하므로 9개나 되는 인덱스를 추가 생성해야 한다.
참고로 한 테이블에 인덱스가 많아지면 조회 성능은 향상되지만 데이터 입력/수정/삭제 성능은 저하된다. 그래서 업무처리에서는 인덱스 수를 가급적 7~8개가 넘지 않도록 하는 것이 좋다.
위 그림은 정규화가 되지 않은 상태의 인덱스가 많은 모델이다. 각 유형별로 모두 인덱스가 걸려 있어야 인덱스에 의해 데이터를 찾을 수 있다. 아래 그림은 이러한 문제점을 해결하기 위해 정규화가 수행된 모델이다.
하나의 테이블에 9개가 반복적으로 나열이 되어 있을 때는 인덱스 생성이 어려웠지만 정규화되어 분리된 이후에는 인덱스 추가 생성이 0개가 되었다. 또한 분리된 테이블 모델기능분류코드에서 PK인덱스를 생성하여 이용함으로써 성능이 향상될 수 있다.
5. 함수적 종속성(Functional Dependency)에 근거한 정규화 수행 필요
함수의 종속성(Functional Dependency)은 데이터들이 어떤 기준값에 의해 종속되는 현상을 지칭하는 것이다. 이 때 기준값을 결정자(Determinant)라 하고 종속되는 값을 종속자(Dependent)라고 한다. 사람이라는 엔터티는 주민등록번호, 이름, 출생지, 호주라는 속성이 존재할 수 있다. 여기서 이름, 출생지, 호주는 주민등록번호 속성에 종속된다. 이를 기호로 표시하게 되면 주민등록번호 -> (이름, 출생지, 호주) 라고 표현할 수 있다. 이 때 주민등록번호가 이름, 출생지, 호주를 함수적으로 결정한다라고 말할 수 있다.
함수의 종속성은 데이터가 가지고 있는 근본적인 속성으로 인식되고 있는데, 이와 같이 함수의 종속성을 가지는 모델링은 정규화가 필수적이다. 정규화의 궁극적인 목적이 반복적인 데이터를 분리하고 각 데이터가 종속된 테이블에 적절하게 배치되도록 하는 것이므로 이 함수의 종속성을 이용하여 정규화 작업이나 각 오브젝트에 속성을 배치하는 작업에 이용이 되는 것이다.
기본적으로 데이터는 속성간의 함수종속성에 근거하여 정규화되어야 한다. 정규화는 프로젝트에서 필수사항이며, IT프로젝트를 진행하는 설계자는 정규화의 이론을 반드시 숙지하고 데이터 모델링을 해야 한다.
'Computer Science > SQL-D' 카테고리의 다른 글
[SQLD] 9. 대량 데이터에 따른 성능 (0) | 2016.08.05 |
---|---|
[SQLD] 8. 반정규화와 성능 (0) | 2016.08.04 |
[SQLD] 6. 성능 데이터 모델링의 개요 (0) | 2016.08.04 |
[SQLD] 5. 식별자(Identifiers) (0) | 2016.08.01 |
[SQLD] 4. 관계(Relationship) (0) | 2016.08.01 |