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

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


8.1 정규화를 통한 성능 향상

  • 정규화가 잘 되어 있으면 입력,수정,삭제의 성능이 향상되고, 반정규화를 많이 할수록 조회 성능이 향상된다.


8.1.1 두개의 엔티티 타입이 통합되어 반정규화된 경우

  • 경매에 대한 간단한 사례로, 매각 물건이 있으면 해당 매각 물건은 특정 날짜에 지정된 여러 장소에서 매각을 하고, 매각된 내용에 대한 통계 데이터를 관리하는 데이터모델이다. 이 업무에서는 매각 일자에 따라 매각 시간고 매각 장소가 결정된다. 매각 일자는 대략적을 5천건이 있고, 일자별 매각 물건은 100만 건으로 가정하자.
  • VLDB:그림8-2에서 만약 매각장소 '서울7호'에서 매각된 총 매각금액, 총유찰금액을 산출하는 조회용 SQL문장을 작성하면 다음과 같이 작성된다.

SELECT B.총매가 금액, B.총유찰금액
FROM (SELECT DISTINCT 매각일자 
      FROM 일자별매각물건
	  WHERE 매각장소 = '서울 7호') A, <== 100 만 건의 데이터를 읽어 DISTINCT함
매각일자별 매각내역 B
WHERE A.매각일자 = B.매각일자

  • 즉 대량으로 존재하는 데이터에서 조인조건이 되는 대상을 찾기 위해 인라인뷰를 사용함으로써 성능이 저항되는 사례이다.

[질문]

그러면 위의 일자별 매각물건은 1차,2차,3차 정규화 대상 중 어디에 속할까? 즉시 대답할수 없다면 2장 정규화 부분을 다시 참고하기 바란다.

  • 복합 식별자중에서 일반 속성이 주식별자 속성 중 일부에만 종속관계를 가지고 있으므로 2차 정규화 대상이 된다. 2차 정규화를 적용하면 다음과 같은 모델이 된다.

  • 2차 정규화를 적용하여 매각일자가 PK가 되고, 매각시간과 매각 장소가 일반속성이 되었다. 정규화를 적용함으로써 매각일자를 PK로 사용하는 매각일자별 매각내역과도 관계가 연결될수 있어 업무 흐믈에 따른 정확한 데이터 모델링 표기도 가능하게 되었고, 드라이빙된 테이블이 5천 건의 매각기일 테이블이 되어 성능도 향상되었음을 알 수 있다.

SELECT B.총매각금액, B.총유찰금액
FROM 매각기일 A, 
     매각일자별매각내역 B
WHERE A.매각장소 = '서울 7호' <== 5천 건의 데이터를 읽음
AND   A.매각일자 = B.매각일자


8.1.2 두 개의 속성을 나열하여 반 정규화된 경우

  • 모델이라고 하는 테이블에는 업무적으로 필요한 8개의 인덱스가 이미 생성되어 있는 상태이다. 데이터는 30만건이고, 온라인 환경의 데이터베이스라고 가정하자. 유형기능분류코드에 따라 데이터를 조회하는 경우가 많이 나타나 인덱스를 생성하려고 하니 유형기능분류코드 각각에 대해 인덱스를 생성해야 하므로 무려 9개나 되는 인덱스를 추가로 생성해야 한다.
  • 각 유형 코드별로 조건을 부여하여 모델코드와 모델명을 조회하는 SQL문장을 작성한 다면 다음과 같이 작성된다.

SELECT 모델코드, 모델명
FROM   모델
WHERE  (A유형기능분류코드1 = '01')
OR     (B유형기능분류코드2 = '02')
OR     (C유형기능분류코드3 = '07')
OR     (D유형기능분류코드4 = '01')
OR     (E유형기능분류코드5 = '02')
OR     (F유형기능분류코드6 = '07')
OR     (G유형기능분류코드7 = '03')
OR     (H유형기능분류코드8 = '09')
OR     (I유형기능분류코드9 = '09')


[질문]

위의 모델은 1차, 2차, 3차 정규화 대상중 어디에 속할까? 즉시 대답할수 없다면 2장 정규화 부분을 다시 한번 참조하기 바란다.

  • 중복속성에 대한 분리가 1차 정구화의 정의임을 고려하면 모델 테이블은 1차 정규화 대상이된다. 로우 단위의 대상도 1차 정규화 대상이지만, 컬럼단위로 중복되는 경우도 1차정규화 대상이 된다.



SELECT A.모델코드, A.모델명
FROM 모델 A, 모델기능분류 B
WHERE (B.유형코드 = 'A' AND B.기능분류코드 = '01' AND A.모델코드 = B.모델코드)
OR    (B.유형코드 = 'B' AND B.기능분류코드 = '02' AND A.모델코드 = B.모델코드)
OR    (B.유형코드 = 'C' AND B.기능분류코드 = '07' AND A.모델코드 = B.모델코드)
OR    (B.유형코드 = 'D' AND B.기능분류코드 = '01' AND A.모델코드 = B.모델코드)
OR    (B.유형코드 = 'E' AND B.기능분류코드 = '02' AND A.모델코드 = B.모델코드)
OR    (B.유형코드 = 'F' AND B.기능분류코드 = '07' AND A.모델코드 = B.모델코드)
OR    (B.유형코드 = 'G' AND B.기능분류코드 = '03' AND A.모델코드 = B.모델코드)
OR    (B.유형코드 = 'H' AND B.기능분류코드 = '09' AND A.모델코드 = B.모델코드)
OR    (B.유형코드 = 'I' AND B.기능분류코드 = '09' AND A.모델코드 = B.모델코드)

  • SQL구문은 유형코드 + 기능분류코드 + 모델코드 에 인덱스가 걸려 있으므로 인덱스를 통해 데이터를 조회하면 성능히 향상된다.
  • 데이터 모델링을 전개할 때 기본적으로 정규화를 적용하도록 해야한다. 일단 정규화를 적용한 데이터 모델을 만들고 난 이후에 업무적으로 발생시키는 트랜잭션의 성격, 분산환경등의 조건에 따라 반정규화를 적용하도록 한다.
"구루비 데이터베이스 스터디모임" 에서 2009년에 "데이터베이스 설계와 구축(개정판)" 도서를 스터디하면서 정리한 내용 입니다.

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

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

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

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