본문 바로가기
  • ㄹㅇ
SQL

[SQLD] 2장 데이터 모델과 성능

by 한강석 2024. 4. 16.

성능 데이터 모델이란

성능 향상(조회, 수정 시)을 목적으로 정규화 , 반정규화 , 테이블 통합, PK, FK, 조인 등을 고려하여 설계하는 것이다. 성능 향상을 위한 비용은 프로젝트 수행에 있어 빠를수록 적어진다. 따라서 분석/ 설계 단계에서 데이터 베이스 처리 성능을 향상할 방법을 면밀히 고려해야 한다. 

 

  • 성능 데이터 모델링 고려사항
  1. 정규화를 정확하게 수행한다. 
  2. 용량과 트랜잭션의 유형에 따라 반정규화 시행한다. 
  3. 데이터베이스 용량 산정을 수행한다. 
  4. 데이터베이스에 반영되는 트랜잭션을 파악한다. 
  5. 이력 모델의 조정, PK/ FK 조정, 슈퍼/ 서브타입 조정한다. 
  6. 성능관점에서 검증하기

정규화

정규화는 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반 속성을 의존자로 하여 입력/수정/삭제 이상현상을 제거하는 것이다. 이런 이상현상은 주로 데이터의 중복 때문에 일어나는데 정규화를 수행하고 나면 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다.

하지만 정규화된 테이블이 데이터를 조회할 때에도 속도가 무조건 빨라지는 것은 아니며 오히려 느려질 수도 있는 특성이 있다.

 

  • 정규화 설명
  1. 제1 정규형: 각 칼럼이 하나의 속성만을 가지고 각 칼럼은 같은 종류나 타입의 값을 가져야한다. 또한 칼럼마다 유일한 이름을 가져야 한다.
  2. 제2 정규형: 제1 정규형을 만족시키면서 모든 칼럼이 부분적 종속이 없어야 한다. (완전 함수 종속을 만족) 완전 함수 종속이란 기본키의 부분집합이 결정자가 되어선 안된다. 즉, 기본키 중 하나로 속성이 결정되면 안됨.
  3. 제 3정규형: 제2 정규형을 만족시키면서 이행 종속성이 없어야 한다. 이행 종속성이란 A > B, B > C 일때 A > C면 이행 종속이라 한다. 학생 > 과목 > 교수 면 학생을 알면 교수까지 알 수 있다. 이때 학생, 과목 / 과목, 교수로 분리해야 함.
  4. BCNF(보이스코드 정규형) : 제3 정규형을 만족하면서 모든 결정자가 후보키 집합에 속해야 한다. 결정자 이면서 후보키가 아닌 것을 제거해야 한다.

반정규화

 

데이터를 의도적으로 중복시켜 조인으로 인한 성능저하나 칼럼 계산에 의해 저해되는 것을 막는 것. 그러나 데이터의 중복으로 데이터의 무결정성이 깨질 가능성이 높아지므로 주의를 요한다.

  • 다음과 같은 경우에 반정규화를 고려한다.
  1. 자주 사용되는 테이블에 접근하는 프로세스의 수가 많고 항상 일정한 범위만을 조회하는 경우
  2. 테이블에 대량의 데이터가 있고 대량의 데이터 범위를 자주 처리하는 경우에 처리범위를 일정하게 줄이지 않으면 성능을 보장할 수 없을 경우
  3. 통계성 프로세스에 의해 통계 정보를 필요로 할 때 별도의 통계 테이블을 생성한다.
  4. 테이블에 지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우

  • 반정규화 대상에 다른 방법을 우선 검토한다. (데이터의 무결정성을 깨지 않는 방법을 먼저)
  1. 지나치게 많은 조인이 걸린 건 뷰(View)를 이용하여 해결할 수 있다. 뷰가 성능 자체를 향상하지는 않지만 SQL문장을 작성하기 간편하게 해 성능저하의 위험을 예방할 수 있다.
  2. 대량의 데이터 처리나 부분처리에 의해 성능이 저하되면 클러스터링이나 인덱스를 고려한다.
  3. 대량의 데이터는 PK의 성격에 따라 파티셔닝하여 분리한다.
  4. 응용 애플리케이션에서 로직을 구사하는 방법을 변경함으로써 성능을 향상시킬 수 있다.

위에서 해결이 안되면 반정규화를 적용한다.

 

 

테이블 반정규화

테이블 병합
1:1 관계 테이블 병합
1:1 관계를 통합하여 성능향상
1: M 관계 테이블 병합
1:M 관계를 통합하여 성능향상
슈퍼/서브타입 테이블 병합
슈퍼 서브 관계 통합하여 성능향상
테이블 분할
수직 분할
칼럼단위의 테이블을 1:1로 분리
수평 분할
로위 단위로 테이블을 쪼갬
테이블 추가
중복테이블 추가
다른 업무나 서버의 테이블을 중복하여 원격조인 제거
통계테이블 추가
SUM, AVG 등을 수행해 조회시 성능 향상
이력테이블 추가
이력테이블 중 마스터 테이블에 존재하는 레코드를 이력테이블에 존재하게 함
부분테이블 추가
전체 칼럼 중 자주 이용하는 칼럼을 모아 별도의 테이블 구성

 

칼럼의 반정규화

중복 칼럼 추가
조인할 때 성능저하를 예방하기 위해 중복된 칼럼을 위치시킴
파생 칼럼 추가
트랜잭션이 처리되는 시점에 계산에 의해 발생되는 성능저하를 예방하기 위해 미리 값을 계산하여 칼럼에 보관
이력테이블 칼럼 추가
대량의 이력데이터를 처리할 때 불특정 날 조회나 최근 값을 조회할 때 기능성 칼럼(최근값 여부, 시작과 종료일자)등을 추가함
PK에 의한 칼럼 추가
복합의미를 갖는PK를 단일 속성으로 구성하였을 경우 단일 PK안에서 특정 값을 별도로 조회하는 경우 성능저하가 일어남. 이 때 이미 PK안에 데이터가 있지만 일반 속성으로 포함하는 기법
응용시스템 오작동을 위한 칼럼 추가
사용자가 데이터 처리를 하다가 잘못 처리하여 원래 값으로 복구하기를 원하는 경우 이전 데이터를 임시적으로 중복하여 보관하는 기법

 

관계의 반정규화

중복 관계 추가
데이터를 처리하기 위한 여러 경로를 거쳐 조인이 가능하지만 조인 성능 향상을 위해 추가적인 관계를 맺는 방법

 

대량 데이터에 의한 성능

테이블이 너무 크면 로우 길이가 길어져 데이터 블록 하나에 저장되지 못하고 2개 이상의 블록에 걸쳐 하나의 로우가 형성되는 현상인 로우 체이닝이나 수정된 데이터를 해당 데이터 블록에 저장하지 못하고 다른 블록에 저장하는 로우 마이그레이션이 발생한다. 이는 적절한 파티셔닝으로 데이터를 분산하여 성능을 향상시켜 해결할 수 있다.

Oracle에서

  1. Range partition : 데이터를 1월, 2월 ... 12월로 쪼개듯이 일정한 구간 별로 자름
  2. List partition : 내부적으로 list 를 구분하여 파티션 테이블에서 트랜잭션을 수행함

 

슈퍼/서브타입 모델

업무를 구성하는 데이터의 특징을 분석하여 공통점/차이점을 고려하여 효과적으로 표현할 수 있다.

공통부분을 슈퍼타입으로 하고 공통 부분에서 상속받아 차이가 있는 속성을 서브엔터티로 한다.

 

슈퍼 타입 / 서브타입 모델의 변환이 필요한 경우

  1. 트랜잭션은 항상 일괄로 처리하는데 테이블은 개별로 유지되어 Union 연산에 의해 성능이 저하될 수 있다.
  2. 트랜잭션은 항상 서브타입 개별로 처리하는데 테이블은 하나로 통합되어 있어 불필요하게 많은 양의 데이터가 집약되어 있어 성능이 저하되는 경우가 있다.
  3. 트랜잭션은 항상 슈퍼+서브 타입을 공통으로 처리하는데 개별로 유지되어 있거나 하나의 테이블로 집약되어 있어 성능이 저하되는 경우가 있다.

 

슈퍼/서브는 논리적인 모델로 물리적으로 구현하는 방법은 다음과 같다.

  1. 1:1 타입: 개별로 발생하는 트랜잭션에 대해서는 개별 테이블로 구성. (슈퍼, 서브 각각 따로 따로)
  2. 슈퍼 + 서브 타입 : 슈퍼와 서브를 묶어서 트랜잭션이 발생하면 둘을 묶어 하나의 테이블로 구성
  3. 싱글 타입: 전체를 하나로 묶어 트랜잭션이 발생하면 all in one 으로 하나의 테이블로 구성

또한 인덱스 정렬구조를 이해하면 PK, FK 칼럼 순서를 고려해 효율적으로 이용할 수 있다.

 

테이블이 만들어질 때 앞쪽에 놓인 PK부터 인덱스를 만드므로 앞 쪽에 자주 쓰고 '=' 으로 비교되는 속성이 오는 것이 좋다.  FK는 인덱스를 따로 생성하는 쪽이 대체로 성능이 향상된다.

 

분산데이터베이스

 

데이터베이스를 네트워크를 이용하여 여러 지역에 분산시켜 사용성, 성능을 극대화시킨 데이터베이스

  • 분산 데이터베이스가 되기 위해 만족해야하는 투명성 6가지
  1. 분할 투명성(단편화) : 하나의 논리적 관계가 여러 단편으로 분할되어 각 단편의 사본이 여러 사이트에 저장
  2. 위치 투명성: 사용하려는 데이터의 저장 장소 명시 불필요. 위치정보가 시스템 카탈로그에 유지되어야 한다.
  3. 지역사상 투명성: 지역DBMS와 물리적 DB사이의 mapping 보장. 각 지역시스템 이름과 무관한 이름 사용 가능
  4. 중복 투명성: DB 객체가 여러 사이트에 중복되어 있는지 알 필요가 없는 성질
  5. 자애 투명성: 구성요소(DBMS, Computer)의 장애에 무관한 트랜잭션의 원자성 유지
  6. 병행 투명성: 다수 트랜잭션 동시 수행시 결과의 일관성 유지, 타임스탬프, 분산 2단계 locking을 이용 구현

  • 기법
  1. 테이블 위치 분산: 설계된 테이블의 위치를 각각 다르게 위치시키는 것
  2. 테이블 분할 분산: 각각의 테이블을 쪼개 분산시킴. (로우 단위- 수평분할/ 칼럼단위- 수직분할)
  3. 테이블 복제 분산: 부분복제 - 통합된 테이블을 한 군데에 가지고 있으면서 각 지사별로 지사에 해당하는 row를 가진 형태. 광역복제 - 통합된 테이블을 본사가 가지고 있으면서 각 지사별로 동일한 데이터를 가지는 형태
  4. 테이블 요약 분산: 분석요약 - 각 지사별로 요약정보를 본사에서 다시 통합하여 요약정보를 산출

통합요약 - 각 지사별로 존재하는 다른 내용의 정보를 본사에 통합