목차

1. 반정규화를 통한 성능향상 전략
2. 반정규화의 기법
3. 정규화가 잘 정의된 데이터 모델에서 성능이 저하될 수 있는 경우
4. 정규화가 잘 정의된 데이터 모델에서 성능이 저하된 경우

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

가. 반정규화의 정의

  • 반정규화(=역정규화, De-Normalization): 정규화된 엔터티, 속성, 관계에 대해 시스템의 성능향상과 개발(Development)과 운영(Maintenance)의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링의 기법을 의미
    • 좁은 의미 : 데이터를 중복하여 성능을 향상시키기 위한 기법
    • 넓은 의미 : 성능을 향상시키기 위해 정규화된 데이터 모델에서 중복, 통합, 분리 등을 수행하는 모든 과정
  • 참고 : 비정규화는 정규화를 수행하지 않음을 의미

참고사항

반정규화를 설계단계에서 수행하지 않는 경우 아래와 같은 현상발생

  • 성능이 저하된 데이터베이스가 생성될 수 있다.
  • 구축단계나 시험단계에서 반정규화를 적용할 때 수정에 따른 노력비용이 많이 들게 된다.

나. 반정규화의 적용방법

  1. 반정규화의 대상을 조사한다.
    • 자주 사용되는 테이블에 접근(Access)하는 프로세스의 수가 많고 항상 일정한 범위만을 조회하는 경우
    • 대량의 데이터가 존재하고 넓은 범위의 데이터를 자주 처리하는데, 처리범위를 줄이지 않으면 성능을 보장할 수 없는 경우
    • 통계성 프로세스에 의해 통계 정보를 필요로 하는 경우
    • 테이블에 지나치게 많은 조인(JOIN)이 걸려 데이터 조회에 기술적 어려움이 존재하는 경우
  2. 반정규화의 대상에 대해 다른 방법으로 처리할 수 있는지 검토한다.
    • 지나치게 많은 조인(JOIN)이 걸려 데이터 조회에 기술적 어려움이 존재하는 경우 뷰(VIEW)를 사용하여 해결할 수 있음
    • 대량의 데이터처리나 부분처리에 의해 성능이 저하되는 경우 클러스터링을 적용하거나 인덱스를 조정함으로써 성능저하현상을 해결할 수 있음
    • 대량의 데이터는 Primary Key의 성격에 따라 파티셔닝 기법(Partitioning)을 적용하여 성능저하 현상을 해결할 수 있음
    • 응용 애플리케이션에서 로직을 구사하는 방법을 변경함으로써 성능을 향상시킬 수 있음(예 : 캐쉬기술 등)
  3. 반정규화를 적용한다.
    • 반정규화 이외의 다른 성능향상 방안에 대한 고려가 충분히 이루어진 후, 반정규화를 고려하게 되었다면 다양한 방법에 의한 반정규화 기법을 적용할 수 있음(예 : 테이블, 속성, 관계의 추가, 분할, 제거 등)

2. 반정규화의 기법

가. 테이블 반정규화

나. 칼럼 반정규화

다. 관계 반정규화

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

  • 위 모델에서 '공급자번호 1001~1005에 해당하는 공급자번호, 공급자명, 전화번호, 메일주소, 위치에 대한 정보를 조회하라(단, 전화번호, 메일주소, 위치는 최근 변경된 값)'를 쿼리로 작성하면

SELECT A.공급자명, B.전화번호, C.메일주소, D.위치 
FROM 공급자 A
        , (SELECT X.공급자번호, X.전화번호
            FROM 전화번호 X
                      , (SELECT 공급자번호, MAX(순번) 순번 
                          FROM 전화번호 
                          WHERE 공급자번호 BETWEEN '1001' AND '1005' 
                          GROUP BY 공급자번호) Y 
            WHERE X.공급자번호 = Y.공급자번호 
            AND X.순번 = Y.순번) B
        , (SELECT X.공급자번호, X.메일주소 
            FROM 메일주소 X
                     , (SELECT 공급자번호, MAX(순번) 순번 
                        FROM 메일주소 
                        WHERE 공급자번호 BETWEEN '1001' AND '1005' 
                        GROUP BY 공급자번호) Y
           WHERE X.공급자번호 = Y.공급자번호 
            AND X.순번 = Y.순번) C
         , (SELECT X.공급자번호, X.위치 
            FROM 위치 X
                     , (SELECT 공급자번호, MAX(순번) 순번
                        FROM 위치
                        WHERE 공급자번호 BETWEEN '1001' AND '1005' 
                        GROUP BY 공급자번호) Y
             WHERE X.공급자번호 = Y.공급자번호 
             AND X.순번 = Y.순번) D
WHERE A.공급자번호 = B.공급자번호 
AND A.공급자번호 = C.공급자번호
AND A.공급자번호 = D.공급자번호
AND A.공급자번호 BETWEEN '1001' AND '1005' ;

  • 쿼리가 매우 복잡해짐

  • 위 모델처럼 각각의 전화번호, 메일주소, 위치의 최근 데이터를 공급자 엔터티에 속성으로 추가하는 반정규화를 적용한 뒤 쿼리를 다시 작성하면

SELECT 공급자명, 전화번호, 메일주소, 위치 
FROM 공급자 
WHERE 공급자번호 BETWEEN '1001' AND '1005' 

  • 쿼리가 단순해지고, 정규화된 경우에 비해 조회성능도 향상됨(단, 무결성에 대한 보완책이 마련되야 함)

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

  • 업무 영역이 커지고 다은 업무와의 인터페이스가 많아짐에 따라 데이터베이스 서버가 여러대인 경우가 있음
  • 서버A와 서버B간의 연계 테이블이 어느 한쪽 데이터베이스 서버에 있고, 빈번하게 사용되는 경우 서버간 조인이 발생하여 성능이 저하될 수 있음

  • 위의 모델을 통해 서버B의 연계테이블에서 부서명에 따른 연계상태코드를 가져오는 SQL구문을 작성하면

SELECT C.부서명, A.연계상태코드
FROM 연계 A, 접수 B, 부서 C     
WHERE A.부서코드 = B.부서코드 
AND A.접수번호 = B.접수번호 
AND B.부서코드 = C.부서코드 
AND A.연계일자 BETWEEN '20040801' AND '20040901' ;

  • 서버A와 서버B가 조인이 걸려 네트워크 부하가 발생하고, 성능도 저하 됨

  • 위 모델처럼 빈번하게 사용되는 부서명을 서버B에 추가하는 반정규화를 적용하여 쿼리를 다시 작성하면

SELECT 부서명, 연계상태코드 
FROM 연계 
WHERE 연계일자 BETWEEN '20040801' AND '20040901' ;

  • 쿼리도 단순해지고, 조회성능도 향상됨(단, 데이터의 무결성에 대한 보완이 필요함)

문서에 대하여