본문 바로가기

SQLD

[SQLD : Ⅱ. 데이터 모델과 성능] 3. 반정규화와 성능

* 반정규화

 - 정규화된 엔티티, 속성, 관계에 대해 시스템의 성능향상과 개바라과 운영의 단순화를 위해

    중복, 통합, 분리 등을 수행하는 데이터 모델링의 기법

 - 데이터 무결성이 깨질 수 있는 위험

 - 데이터를 조회할 때 디스크 IO량이 많아서 성능이 서하되거나 경로가 멀어 조인으로 인한 성능저하가 예상될 때

 - 정규화는 입력, 수정, 삭제에 대한 성능을 향상시킬 뿐 아니라 조회에 대해서도 성능을 향상시키는 역할을 함

 - 함수적 종속관계에는 위반하지 않지만 데이터의 중복성을 증가시켜야만 데이터조회의 성능을 향상 시키는 경우

 - 반정규화를 기술적으로 수행하지 않은 경우

    성능이 저하된 데이터베이스가 생성될 수 있음

    구축이나 시험 단계에서 반정규화를 적용할 때 수정에 따른 노력비용이 많이 들게 됨

 

* 반정규화 적용 방법

 1) 반정규화 대상 조사 : 범위처리빈도수 조사, 대량의 범위처리 조사, 통계성 프로세스 조사, 테이블 조인 개수

 2) 다른 방법유도 검토 : 뷰테이블, 클러스터링적용, 인덱스의 조정, 응용 어플리케이션

 3) 반정규화 적용 : 테이블 반정규화, 속성 반정규화, 관계 반정규화

 

* 테이블 반정규화

* 컬럼 반정규화

* 관계 반정규화 

 

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

 1) 공급자 엔티티가 마스터, 전화번호와 메일주소 위치가 변경되는 내용이 이력형태로 관리되는 데이터 모델

  - 공급자 정보를 가져오는 경우

   공급자 전화번호, 메일주소, 위치는 1:M 관계로 한 명의 공급자당 여러 개의 전화번호, 메일주소, 위치 존재

   가장 최근에 변경된 값을 가져오기 위한 SQL 구문

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'

 2) 데이터베이스 서버가 분리되어 분산데이터베이스가 구성되어 있을 때 반정규화를 통해 성능향상 가능한 경우

  - 서버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 조인이 발생하지 않아서 성능 개선

    반정규화 적용 시 기억할 내용은 데이터 입력, 수정, 삭제 시 성능이 떨어지는 점을 기억하고

    데이터 무결성 유지에 주의