1. 정규화를 통한 성능 향상 전략
- 정규화를 하는 것은 기본적으로 데이터에 대한 중복성을 제거하여 주고 데이터가 관심사별로 처리되는 경우가 많기 때문에 성능이 향상되는 특징을 가짐
- 데이터베이스에서 데이터를 처리할 때 성능의 종류
- 조회
- 입력/수정/삭제
- 둘다 좋은면 좋겠지만 둘 중하나만 좋은 경우(Trade-Off)가 많다.
- 정규화를 수행한다는 것은 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반속성을 의존자로 하여 입력/수정/삭제 이상을 제거하는 것
- 정규화된 테이블은 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있는 특성

- 정규화 수행 모델은
- 데이터를 입력/수정/삭제할 때 일반적으로 반정규화된 테이블에 비해 처리 성능이 향상
- 데이터를 조회 할 때에는 처리 조건에 따라 조회 성능이 향상될 수도 있고 저하 될 수도 있음
- 반정규화만이 조회 성능을 향상시키는 것이 아니며, 정규화를 해야만 성능이 향상되는 경우도 많이 있다.
2. 반정규화된 테이블의 성능저하 사례1
- 2차 정규화를 적용한 테이블에 조인을 하더라도 PK/Unique Index를 이용하면 조인 성능 저하는 미미하게 발생시킴

3. 반정규화된 테이블의 성능저하 사례2

- "서울 7호"에서 매각된 총매각금액, 총유찰금액을 산출하는SQL
-- A Table인 100만건을 읽으면서 DISTINCT를 함
SELECT B.총매각금액, B.총유찰금액
FROM ( SELECT DISTINCT 매각일자
FROM 일자별매각물건
WHERE 매각장소 = '서울 7호' ) A INNER JOIN 매각일자별매각내역 B ON (A.매각일자 = B.매각일자
AND A.매각장소 = B.매각장소)
- 대량의 데이터에서 조인 조건이 되는 대상을 찾기 위해 인라인뷰를 사용하기 때문에 성능이 저하된다.
- 정규화하려면?
- 복합식별자(매각물건번호 + 매각일자)중에서 일반속성(매각시간 + 매각장소)이 주식별자 속성 중 일부에만 종속관계를 가지고 있으므로 2차 정규화 대상이 된다.
- 매각 일자, 시간, 장소를 별도로 관리하는 엔티티를 2차 정규화를 통해 생성 하여 해결

SELECT B.총매각금액, B.총유찰금액
FROM 매각기일 A, 매각일자별매각내역 B
WHERE A.매각일자 = '서울7호선' --5천건 읽음
AND A.매각장소 = B.매각장소
AND A.매각일자 = B.매각일자;
4. 반정규화된 테이블의 성능저하 사례3
- 동일한 속성 형식을 두 개 이상의 속성으로 나열하여 반정규화한 경우에 해당
- 유형기능분류코드 각각에 대해 인덱스를 생성해야하므로 총 9개의 인덱스 생성 필요
- 한 테이블에 인덱스가 많아지면 조회 성능은 향상되지만 데이터 입력/수정/삭제 성능은 저하 됨

- 각 유형코드별로 조건을 부여하여 모델코드와 모델명을 조회하는 SQL문장을 작성한다면 다음과 같이 나온다.
SELECT 모델코드, 모델명
FROM 모델
WHERE (A유형기능분류코드1 = '01')
OR (B유형기능분류코드2 = '02')
OR (C형기능분류코드2 = '07)
OR (D형기능분류코드2 = '01)
OR (E형기능분류코드2 = '02')
OR (F형기능분류코드2 = '07)
.......;
- 중복속성에 대한 분리가 1차 정규화의 정의

- 정규화되어 분리된 이후에는 인덱스 추가 생성이 0개
SELECT A.모델코드, A.모델명
FROM 모델 A, 모델기능분류코드 B
WHERE ( B.유형코드 = 'A' AND B.기능분류코드 = '01' AND A.모델코드 = B.모델코드 )
OR ( B.유형코드 = 'B' AND B.기능분류코드 = '02' AND A.모델코드 = B.모델코드 )
OR ( B.유형코드 = 'C' AND B.기능분류코드 = '07' AND A.모델코드 = B.모델코드 )
OR ( B.유형코드 = 'D' AND B.기능분류코드 = '01' AND A.모델코드 = B.모델코드 )
OR ( B.유형코드 = 'E' AND B.기능분류코드 = '02' AND A.모델코드 = B.모델코드 )
OR ( B.유형코드 = 'F' AND B.기능분류코드 = '07' AND A.모델코드 = B.모델코드 )
OR ( B.유형코드 = 'G' AND B.기능분류코드 = '03' AND A.모델코드 = B.모델코드 )
OR ( B.유형코드 = 'H' AND B.기능분류코드 = '09' AND A.모델코드 = B.모델코드 )
OR ( B.유형코드 = 'I' AND B.기능분류코드 = '09' AND A.모델코드 = B.모델코드 )
5. 반정규화된 테이블의 성능저하 사례4

- 일재고와 일재고 상세를 구분함으로써 일재고에 발생되는 트랜잭션의 성능저하를 예방할 수 있게 됨
6. 함수적 종속성에 근거한 정규화 수행 필요
- 함수의 종속성(Functional Dependency)
- 데이터들이 어떤 기준값에 의해 종속되는 현상을 지칭하는 것
- 이 때 기준 값을 결정자라 하고 종속되는 값을 종속자라고 한다.

- 사람이라는 엔터티는 주민등록번호, 이름, 출생지, 호주라는 속성이 존재
- 이름, 출생지, 호주라는 속성은 주민등록번호에 종속된다.
- 만약 어떤 사람의 주민등록번호가 신고되면 그 사람의 이름, 출생지, 호주가 생성되어 단지 하나의 값만을 가짐
- 주민등록번호 -> (이름, 출생지, 호주)
- 주민등록번호가 이름, 출생지, 호주를 함수적으로 결정한다.
반응형
'SQLD > SQL 전문가 가이드' 카테고리의 다른 글
| 1.2.5 제5절 데이터베이스 구조와 성능 (0) | 2021.08.23 |
|---|---|
| 1.2.4 제4절 대량 데이터에 따른 성능 (0) | 2021.08.23 |
| 1.2.1 제1절 데이터 모델링의 개요 (0) | 2021.08.23 |
| 1.1.5 제5절 식별자 (0) | 2021.08.23 |
| 1.1.4 제4절 관계 (0) | 2021.08.23 |