1. 정규화의 문제점
- 정규화는 데이터 조회(SELECT) 시에 조인(JOIN)을 유발하기 때문에 CPU와 메모리를 많이 사용합니다.
- 위 그림과 같이 두 개의 테이블로 이루어진 경우 "회원ID, 등급코드, 등급명, 이름, 전화번호"를 조회하려면 조인을 해야 합니다.
## 조인의 사용
SELECT 회원ID, 등급코드, 등급명, 이름, 전화번호
FROM 회원, 등급
WHERE 회원.등급코드 = 등급.등급코드
- 위의 SQL문은 ANSI join을 사용할수도 있으나 넘어가겠습니다.
- 위의 테이블은 회원과 등급테이블에서 등급코드가 같은 것을 찾는 것입니다.
- 이것을 프로그램화한다면 중첩된 루프, for문같은 것을 사용해야 합니다.
## 중첩된 루프
for(i=0;i<N;i++){
for(j=0;j<M;j++){
if(회원.등급코드[i] == 등급.등급코드[j]){
데이터반환
}
}
}
- 위의 코드에서 N은 회원테이블의 건수고, M은 등급테이블의 건수입니다.
- 결과적으로 이런 구조는 데이터 양이 증가하면 비교해야하는 건수도 증가합니다.
- 물론 실제로는 위와 같은 비효율이 발생하지는 않습니다.
- 이런 문제를 해결하기 위해서 인덱스와 옵티마이저가 있기 때문입니다.
- 근데 이 코드를 보여준 것은 조인이 일어난다는 것은 컴퓨터가 조회 시 부하가 발생된다는 것을 보여드리기 위함입니다.
- 정규화의 문제점을 해결하기 위해 반정규화를 해서 하나의 테이블에 저장한다면 조인을 통한 성능저하는 해결이 됩니다.
- 이런 성능 저하를 해결하기 위해 반정규화가 있는 것입니다.
2. 정규화를 사용한 성능 튜닝
- 조인으로 인하여 성능이 저하되는 문제를 반정규화로 해결할 수 있습니다.
- 하지만 반정규화는 데이터를 중복시키기 때문에 또 다른 문제점을 발생시킵니다.
- 위 그림과 같이 테이블을 만들면 조회는 빠르게 할 수 있습니다.
- 하지만 너무 만큼 칼럼을 추가하면 한 개의 행 크기가 데이터베이스 관리 시스템의 입출력 단위인 블록의 크기를 넘어가게 됩니다.
- 그렇게 되면 한 개의 행을 읽기 위해서 여러 개의 블록을 읽어야 합니다.
- 한 행을 읽기 위해서 여러 개의 블록을 읽게 되면 디스크 입출력이 증가하기 때문에 성능이 떨어지게 됩니다.
- 반정규화는 이러한 문제점들을 유발할 수 있습니다.
- 이런 문제를 해결하려면 테이블을 분해하는 방법밖에는 없습니다.
- 따라서 정규화는 입출력 데이터 양을 줄여서 성능을 향상할 수 있는 것입니다.
## 이론 문제 확인하기
다음 설명 중 옳지 않은 것은?
1. 정규화를 수행하면 조회 시에 조인의 수가 증가한다.
2. 반정규화된 테이블이 조회가 더 간단하다.
3. 정규화는 업무가 변경이 되어도 모델의 유연성을 더 향상시킨다.
4. 반정규화는 반드시 해야 한다.
정답 : 4
- 트랜잭션의 유형, 데이터 용량등을 고려해서 특별히 성능 이슈가 없으면 반정규화는 하지 않아도 됩니다.
'자격증 > SQLD 자격증' 카테고리의 다른 글
[SQLD자격증강좌] 11강 분산데이터베이스 - 오쌤의 니가스터디 (0) | 2024.03.08 |
---|---|
[SQLD자격증강좌] 10강 반정규화(De-Normalization) - 오쌤의 니가스터디 (0) | 2024.03.08 |
[SQLD자격증강좌] 8강 정규화(Normalization) - 오쌤의 니가스터디 (0) | 2024.03.07 |
[SQLD자격증강좌] 7강 엔터티 식별자 - 오쌤의 니가스터디 (0) | 2024.03.07 |
[SQLD자격증강좌] 6강 관계(RelationShip) - 오쌤의 니가스터디 (0) | 2024.03.07 |