정규화는 데이터 조회(SELECT) 시에 조인(Join)을 유발하기 때문에 CPU와 메모리를 많이 사용한다.
(직원)
사원번호 |
---|
부서코드(FK) |
이름 |
전화번호 |
주소 |
(부서)
부서코드 |
---|
부서명 |
위와 같이 두 개의 테이블로 이루어진 경우 "사원번호, 부서코드, 부서명, 이름, 전화번호, 주소"를 조회하려면 조인을 해야 한다.
조인의 사용
SELECT
사원번호, 부서코드, 부서명, 이름, 전화번호, 주소
FROM
직원.부서
WHERE
직원.부서코드 = 부서.부서코드;
중첩된 루프
for(i=0; i<N; i=i+1)
for(j=0; j<M; j=j+1)
if(직원_부서코드[i] == 부서_부서코드[j]){ }
조인으로 인하여 성능이 저하되는 문제를 반정규화로 해결할 수 있다.
반정규화는 데이터를 중복시키기 때문에 또 다른 문제점을 발생시킨다.
(계좌마스터)
계좌번호 |
---|
계좌명 |
계좌등록일자 |
계좌구분 |
상품구분 |
휴면계좌여부 |
최종계좌사용정보 |
예수금 |
평균잔고 |
관리지점 |
등록단말 |
담당자 |
고객등급 |
위처럼 계좌마스터의 칼럼이 계속적으로 증가하면 조인이 최소화되기 때문에 조회를 빠르게 할 수 있을 것이다.
하지만 너무 많은 칼럼이 추가되면 한 개 행의 크기가 데이터베이스 관리 시스템의 입출력 단위의 블록의 크기(Block Size)를 넘어서게 된다.
그렇게 되면 한 개의 행을 읽기 위해서 여러 개의 블록을 읽어야 한다.
한 행을 읽기 위해서 여러 개의 블록을 읽게 되면 디스크 입출력이 증가하기 때문에 성능이 떨어지게 된다.
반정규화는 이러한 문제점을 유발할 수 있다.
위와 같은 문제가 발생하면 테이블을 분해하는 방법밖에 없다.
따라서 정규화는 입출력 데이터 양을 줄여서 성능을 향상시킬 수 있는 것이다.