데이터베이스 설계와 구축(개정판) (2009년)
반정규화를 통한 성능향상 0 0 41,565

by 구루비스터디 성능 데이터 모델링 [2019.08.11]


8.2 반정규화를 통한 성능향상

  • 정규화 규칙 1차, 2차, 3차, BCNF, 4차 정규화를 체계적으로 적용하였는데, 물리적인 데이터 모델을 설계할 때 적절하게 반 정규화를 수행하지 않으면 성능저하 현상이 나타난다. 반정규화를 전혀 적용하지 않아 복잡한 SQL구문이 작성되어 가독성이 떨어지며, SQL구문의 성능이 저하되는 경우가 많이 나타난다.


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

  • VLDB:그림 8-6은 공급자라고 하는 엔티티타입이 마스터고, 변경되는 전화번호와 메일주소, 위치의 내용이 이력형태로 관리되는 데이터 모델이다. 이 모델에서 공급자 정보를 가져오는 경우를 가정해 보자.

  • 공급자와 전화번호, 메일주소, 위치는 1:M관계이므로 공급자 한 명당 여러 개의 전화번호, 메일주소, 위치가 존재한다, 따라서 가장 최근에 변경된 값을 가져오기 위해서는 조금 복잡한 조인이 발생될수밖에 없다.

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'

  • 정규화된 모델이 적절하게 반정규화되지 않으면 위와 같은 복잡한 SQL구문이 쉽게 나온다.
  • VLDB:그림8-6을 적절하게 반정규화하면, 즉 가장 최근에 변경되 값을 마스터에 위치시키면 VLDB:그림8-7과 같다.


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


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

  • 업무 영역이 커지고 다른 업무와 인터페이스가 많아짐에 따라 데이터베이스 서버가 여러대인 경우가 있다. VLDB:그림8-8은 데이터베이스 서버가 분리되어 분산데이터베이스가 구성되어 있을때 반정규화를 통해 성능을 향상시킬수 있는 경우다.
  • 서버 A에 부서와 접수테이블이 있고, 서버B에 연계라는 테이블이 있는데, 서버B에서 데이터를 조회할때 빈번하게 조회되는 부서코드가 서버 A에 존재하기 때문에 연계, 접수,부서 테이블이 모두 조인된다. 게다가 분산 데이터베이스 환경이기 때문에 다른 서버간에도 조인이 걸려 성능이 저하된다.

  • 위 모델을 통해 서버 B의 연계 테이블에서 부서명에 따른 연계상태코드를 가져오는 SQL구문은 다음과 같이 작성된다.

SELECT c.부서명, a.연계상태
  FROM 연계 a, 접수 b, 부서 c  <== 서버 A와 서버 B가 조인이 걸림
 WHERE a.부서코드 = b.부서코드
   AND a.접수번호 = b.접수번호
   AND b.부서코드 = c.부서코드
   AND a.연계일자 BETWEEN '20040801' AND '20040901'

  • 오라클의 경우 DB LINK조인이 발생하여 일반 조인보다 성능이 저하될 것이다.
  • 위의 분산환경에 따른 데이터모델을 다음과 같이 서버 A에 있는 부서 테이블의 부서명을 서버 B의 연계 테이블에 부서명으로 속성 반정규화를 함을써 조회성능을 향상시킬수 있다.


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

  • SQL구문도 간단해지고 분산되어 있는 서버간에도 DB LINK 조인이 발생하지 않아 성능이 개선되었다.
  • 반정규화를 적용할때 기억햐야할 점은 데이터를 입력,수정,삭제할 때는 성능이 떨어진다는 점이며, 데이터 무결성 유지에 주의해야 한다.
"구루비 데이터베이스 스터디모임" 에서 2009년에 "데이터베이스 설계와 구축(개정판)" 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/4248

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입