데이터베이스 설계와 구축(개정판) (2009년)
PK순서 조정을 통한 성능향상 0 0 56,725

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


8.3 PK순서 조정을 통한 성능향상

  • PK가 여러 개의 속성으로 구성된 복합 식별자일 때 PK순서에 대해 별로 고려하지 않고 데이터 모델링을 한 경우에는 성능 저하 현상이 많이 해당된다.
  • 물리적인 데이터 모델링 단계에서는 스스로 생성된 PK순서 이외에 다른 엔티티타입으로 부터 상속받아 발생되는 PK순서까지 항상 주의하여 표시하도록 해야한다.
  • PK순서를 경정하는 기준은 인덱스 정렬 구조를 이해한 상태에서 인덱스를 효율적으로 이용할 수 있도록 PK순서를 지정해야 한다. 즉 인덱스의 특징은 여러개의 속성이 하나의 인덱스로 구성되어 있을 때 앞쪽에 위치한 속성값이 비교자로 잇어야 인덱스가 좋은 효율을 나타낼수 있다.
  • 앞쪽에 위치한 속성값이 가급적 '=' 또는 최소한 범위 'BETWEEN' ''가 들어와야 인덱스를 이용할수 있다.


8.3.1 PK순서를 잘못 지정하여 성능이 저하된 경우(간단한 오류)

  • 입시마스터 테이블의 PK는 수험번호+년도+학기로 구성되어 있고,전형과목실적 테이블은 입시마스터 테이블에서 상속받은 수험번호+년도+학기에 전형과목코드로 PK가 구성되어 있는 복합식별자 구조의 테이블이다. 입시마스터에는 200만건의 데이터가 있고, 학사는 4학기로 구성되어 있고, 데이터는 5년 동안 보관되어 있다. 그러므로 한 학기당 평균 2만 건의 데이터가 있다고 가정하자.
  • 이테이블 구조에서 다음과 같은 SQL구문이 실행되면 입시마스커 테이블에 있는 인덱스 입시마스터_I01을 이용할수 있을까?

SELECT COUNT (수험번호)
  FROM 입시마스터
 WHERE 년도 = '2004' AND 학기 = '1'

  • 입시마스터_I01 인덱스가 수험번호+년도+학기 중 수험번호에 대한 값이 WHERE절에 들어 오지 않음으로써 풀 테이블 스캔이 발생하여 200만 건의 데이터를 모두 읽게 되어 성능이 저하되었다.
  • 입시마스터 테이블에 데이터를 조회할 때 년도와 학기에 대한 내용이 빈번하게 들어오므로 그림8-11과 같이 PK순서를 변경함을써 인덱스를 이용할수 있게 한다.


8.3.2 PK순서를 잘못 지정하여 성능이 저하된 경우(복잡합 오류)

  • 현금출급기실적의 PK는 거래일자+사무소코드+출급기번호+명세표번호로 되어 있는데, 대부분의 SQL문장에서는 조회를 할 때 사무소 코드 '='로 들어오고, 거래일자에 대해서는 'BETWEEN'조회를 하고 있다. 이때 SQL는 정상적으로 인덱스를 이용할 수 있지만, 인덱스 효율이 떨어져 성능이 저하되는 경우에 해당된다.

SELECT 건수, 금액
  FROM 현금출급기실적
 WHERE 거래일자 BETWEEN '20040701' AND '20040702' AND 사무소코드 = '00368'

  • 그림 8-13은 거래일자+사무소코드 순서로 인덱스를 구성한 경우와 사무소코드+거래일자 순서로 인덱스를 구성한 경우 데이터를 처리하는 범위와 차이를 보여준다.
  • 거래일자+사무소코드로 구성된 그림을 보면 BETWEEN 비교를 한 거래일자 '20040701'이 인덱스 앞에 위치하기 때문에 범위가 넓어졌고, 사무소코드+거래일자로 구성된 인덱스의 경우 '='비교를 한 사무소코드 '000368'이 인덱스 앞에 위치하여 범위가 좁아졌다.

  • 그러므로 이 경우 인덱스 순서를 고려하여 데이터 모델의 PK순서를 거래일자+사무소코드+출급기번호+명세표번호 에서 사무소코드+거래일자+출급기번호+명세표번호로 수정하여 성능을 개선할수 있다.
  • 테이블의 PK속성 A,B가 있을때 A+B형태로도 빈번하게 조회가 되고, B+A로도 비번하게 조회되는 경우에는 어떻게 할것인가? 이때는 좀저 자주 이용되는 조회의 형태대로 PK순서를 구성하고 이용하게 순서를 바꾼 인덱스를 추가로 생성하는것이 필요하다.
"구루비 데이터베이스 스터디모임" 에서 2009년에 "데이터베이스 설계와 구축(개정판)" 도서를 스터디하면서 정리한 내용 입니다.

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

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

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

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