지구정복

[SQLD] 8. 반정규화와 성능 본문

자격증 정복/SQLD

[SQLD] 8. 반정규화와 성능

eeaarrtthh 2020. 11. 9. 17:54
728x90
반응형

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구문을 작성하면 서버A와 서버B가 조인이 걸려 네트워크 부하가 발생하고, 성능도 저하 됨

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

 

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

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

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

 

 

 

 

 

[출처]

http://wiki.gurubee.net/pages/viewpage.action?pageId=27427184&

728x90
반응형
Comments