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

14821 단어 SQLDSQLD

1. 2장 1절 성능 데이터 모델링 개요

1) 정의

👉 데이터베이스 성능 향상을 목적으로 설계단계의 데이터 모델링때부터 성능과 관련된 사항(정규화, 반정규화, 인덱스 등)이 데이터 모델링에 반영될 수 있도록 하는 것이다.

2) 수행시점

👉 성능 향상을 위한 비용은 프로젝트 수행 중에 있어서 사전에 할수록 비용이 들지 않는다.
👉 특히 분석/설계 단계에서 데이터 모델에 성능을 고려한 데이터 모델링을 수행할 경우 성능저하에 따른 재업무 비용을 최소화할 수 있는 기회를 가지게 된다.

3) 고려사항

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

2. 2장 2절 정규화와 성능

1) 정규화를 통한 성능 향상 전력

👉 정규화는 선택이 아니라 필수사항이다.
👉 정규화를 수행한다는 것은 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반 속성을 의존자로 하여 입력/수정/삭제 이상현상을 제거하는 것이다.
👉 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의일반속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다. 또한, 중복된 데이터를 허용하지 않음으로써 무결성을 유지할 수 있다.
👉 정규화된 테이블은 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있는 특성이 있다.

2) 제1 정규화

👉 테이블의 컬럼이 원자값(하나의 값)을 갖도록 테이블을 분해하는 것이다.
👉 함수 종속과 복수의 속성값을 갖는 속성을 분리하여 속성의 원자성을 확보한다.

📌 예시) 고객취미 테이블

위의 테이블에서 추신수와 박세리는 여러개의 취미를 가지고 있기 때문에 제1정규형을 만족하지 못하고 있다. 그렇기 때문에 이를 제1 정규화하여 분해할 수 있다. 제1 정규화를 진행한 테이블은 아래와 같다.

3) 제2 정규화

👉 제1정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다.
👉 함수 종속, 주식별자에 완전 종속적이지 않은 속성, 부분 종속 속성을 분리한다.
👉 완전 함수 종속 : 기본키의 부분집합이 결정자가 되어선 안된다는 것

📌 예시) 수강 강좌 테이블

이 테이블에서 기본키는 (학생번호, 강좌이름)으로 복합키이다. 그리고 (학생번호, 강좌이름)인 기본키는 강의실을 결정하고 있다. (학생번호, 강좌이름) --> (강의실)
그런데 여기서 강의실이라는 컬럼은 기본키의 부분집합인 강좌이름에 의해 결정될 수 있다. (강좌이름) --> (강의실)
그렇기 때문에 위의 테이블의 경우 다음과 같이 기존의 테이블에서 강의실을 분해하여 별도의 테이블로 관리하여 제2 정규형을 만족시킬 수 있다.

4) 제3 정규화

👉 제 2정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다.
👉 함수 종속, 일반 속성에 종속적인 속성, 이전종속 속성을 분리한다.
👉 이행적 종속 : A -> B, B -> C가 성립할 때 A -> C가 성립되는 것

📌 예시) 계절학기 테이블

기존의 테이블에서 학생 번호는 강좌 이름을 결정하고 있고, 강좌 이름은 수강료를 결정하고 있다. 그렇기 때문에 이를 (학생 번호, 강좌 이름) 테이블과 (강좌 이름, 수강료) 테이블로 분해해야 한다.
이행적 종속을 제거하는 이유는 비교적 간단하다. 예를 들어 501번 학생이 수강하는 강좌가 스포츠경영학으로 변경되었다고 하자. 이행적 종속이 존재한다면 501번의 학생은 스포츠경영학이라는 수업을 20000원이라는 수강료로 듣게 된다. 물론 강좌 이름에 맞게 수강료를 다시 변경할 수 있지만, 이러한 번거로움을 해결하기 위해 제3 정규화를 하는 것이다.
즉, 학생 번호를 통해 강좌 이름을 참조하고, 강좌 이름으로 수강료를 참조하도록 테이블을 분해해야 하며 그 결과는 다음의 그림과 같다.

5) 보이스-코드 정규화(BCNF)

👉 제 3정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다.
👉 함수 종속, 결정자 안에 함수 종속을 가진 주식별자를 분리한다.

📌 예시) 특강수강 테이블

특강수강 테이블에서 기본키는 (학생번호, 특강이름)이다. 그리고 기본키 (학생번호, 특강이름)는 교수를 결정하고 있다. 또한 여기서 교수는 특강이름을 결정하고 있다.
그런데 문제는 교수가 특강이름을 결정하는 결정자이지만, 후보키가 아니라는 점이다. 그렇기 때문에 BCNF 정규화를 만족시키기 위해서 위의 테이블을 분해해야 하는데, 다음과 같이 특강신청 테이블과 특강교수 테이블로 분해할 수 있다.

6) 제4 정규화

👉 다가 종속 속성을 분리한다.

7) 제5 정규화

👉 결합 종속일 경우는 두 개이상의 N개로 분리한다.

3. 2장 3절 반정규화와 성능

👉 정규화된 엔티티, 속성, 관계에 대해 시스템의 성능 향상과 개발과 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링 기법이다.(중복성의 원리 활용)
👉 데이터를 조회할 때 디스크 I/O량이 많아서 성능이 저하되거나 경로가 너무 멀어 조인으로 인한 성능저하가 예상되거나 칼럼을 계산하여 읽을 때 성능이 저하될 것으로 예상되는 경우 반정규화를 수행하게 된다.
👉 일반적으로 정규화 시에는 입력/수정/삭제 성능이 향상되며 반정규화 시에는 조인 성능이 향상된다.
👉 비정규화 : 아예 정규화를 수행하지 않은 모델 지칭

1) 적용 절차

① 반정규화 대상조사

👉 범위처리 빈도수 조사, 대량의 범위 처리 조사, 통계성 프로세스 조사, 테이블 조인 개수

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

② 다른 방법유도 검토

👉 뷰 테이블, 클러스터링 적용, 인덱스의 조정, 응용 에플리케이션

  1. 지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우 VIEW를 사용
  2. 대량의 데이터처리나 부분처리에 의해 성능이 저하되는 경우 클러스터링을 적용하거나 인덱스를 조정
  3. 대량의 데이터는 PK의 성격에 따라 부분적인 테이블로 분리 가능 (파티셔닝 기법)
  4. 응용 애플리케이션에서 로직을 구사하는 방법을 변경함으로써 성능을 향상 가능

③ 반정규화 적용

👉 테이블, 속성, 관계 반정규화

2) 기법

① 테이블 반정규화

  1. 테이블 병합

    • 1:1관계 테이블 병합
      : 1:1관계를 통합하여 성능향상

    • 1:M관계 테이블 병합
      : 1:M관계를 통합하여 성능향상

    • 슈퍼/서브타입 관계 테이블 병합
      : 슈퍼/서브 관계를 통합하여 성능향상

  2. 테이블 분할

    • 수직 분할
      : 칼럼단위의 테이블을 디스크 I/O로 분산처리하기 위해 테이블을 1:1로 분리하여 성능향상
      (트랜잭션의 처리되는 유형 파익이 성행되어야 함)

    • 수평 분할
      : 로우 단위로 집중발생되는 트랜잭션을 분석하여 디스크 I/O 및 데이터 접근의 효율성을 높여 성능을 향상하기 위해 로우 단위로 테이블을 쪼갬 (관계가 없음)

  3. 테이블 추가

    • 중복테이블 추가
      : 다른 업무이거나 서버가 다른 경우 동일한 테이블 구조를 중복하여 원격조인을 제거하여 성능을 향상

    • 통계테이블 추가
      : SUM, AVG 등을 미리 수행하여 계산해 둠으로쏘 조회 시 성능을 향상

    • 이력테이블 추가
      : 이력 테이블 중에서 마스터 테이블에 존재하는 레코드를 중복하여 이력테이블에 존재시켜 성능을 향상

    • 부분테이블 추가
      : 하나의 테이블의 전체 칼럼 중 자주 이용하는 집중화된 칼럼들이 있을 때 디스크 I/O를 줄이기 위해 해당 칼럼들을 모아놓은 별도의 반정규화된 테이블 생성

② 칼럼 반정규화

  1. 중복 칼럼 추가
    : 조인에 의해 처리 할때 성능저하를 예방하기 위해(조인을 감소시키기 위해) 중복된 칼럼을 위치 시킨다.

  2. 파생칼럼 추가(Derived Column)
    : 트랜잭션이 처리되는 시점에 계산에 의해 발생되는 성능저하를 예방하기 위해 미리 값을 계산하여 칼럼에 보관한다.

  3. 이력테이블 칼럼추가
    : 대량의 이력데이터를 처리할 때 불특정 날 조회나 최근 값을 조회할 때 나타날 수 있는 성능저하를 예방하기 위해 이력테이블에 기능성칼럼(최근값 여부, 시작과 종료일자 등)을 추가한다.

  4. PK에 의한 칼럼추가
    : 복합의미를 갖는 PK를 단일 속성으로 구성하였을 경우 발생된다. 단일 PK안에서 특정 값을 별도로 조회하는 경우 성능저하가 발생될 수 있다. 이때 이미 PK 안에 데이터가 존재하지만 성능향상을 위해 일반속성을 포함한다.

  5. 응용시스템 오작동을 위한 칼럼 추가
    : 업무적으로는 의미가 없지만 사용자가 데이터처리를 하다가 잘못 처리하여 원래 값으로 복구하기를 원하는 경우 이전 데이터를 임시적으로 중복하여 보관하는 기법이다.
    칼럼으로 이것을 보관하는 방법은 오작동처리를 위한 임시적인 기법이지만 이것을 이력데이터 모델로 풀어내면 정상적인 데이터 모델의 기법이 될 수 있다.

③ 관계 반정규화

  1. 중복관계 추가
    : 데이터를 추가하기 위한 여러 경로를 거쳐 조인이 가능하지만 이 때 발생할 수 있는 성능저하를 예방하기 위해 추가적인 관계를 맺는 방법이다.

3) 정규화된 테이블의 성능저하 반정규화 통해 해결

📌 예제) 공급자라고 하는 엔티티가 마스터이고 전화번호와 메일주소 위치가 각각 변경되는 애용이 이력형태로 관리되는 데이터 모델이다. 이 모델에서 공급자 정보를 가져오는 경우를 가정한다.

정규화된 모델이 적절하게 반정규화되지 않으면 SQL문이 복잡하게 작성된다.

select 공급자명, 전화번호, 메일주소, 위치
from 공급자
where 공급자번호 between '1001' and '1005'

복잡하게 작성된 SQL문장에 반정규화를 적용하므로 인해 간단하게 작성이 가능해지고 가독성과 성능이 모두 높아진다.

4. 2장 4절 대량 데이터에 따른 성능

👉 로우 체이닝 : 로우의 길이가 너무 길어서 데이터 블록 하나에 데이커가 모두 저장되지 않고 두개 이상의 블록에 걸쳐 하나의 로우가 저장되어 있는 형태
👉 로우 마이그레이션 : 데이터 블록에서 수정이 발생하면 수정된 데이터를 해당 데이터를 블록에서 저장하지 못하고 다른 블록의 빈 공간을 찾아 저장하는 방식

👉 로우 체이닝과 로우 마이그레이션이 발생하여 많은 블록에 데이터가 저장되면 DB 메모리에서 디스크 I/O가 발생할때 많은 I/O가 발생하여 성능저하가 발생한다. 트랜잭션을 분석하여 적절하게 1:1로 분리함으로써 성능향상이 가능하도록 해야한다.

📌 예제) 반정규화된 테이블의 사례 - 정규화 통해 해결

  • 칼럼수가 많을 경우 테이블을 수직분할 (1:1로 분리)

발행기간명, 수량, 중간에 위치한 공고일,발행일을 가져오는 동일한 SQL구문에 대해서도 디스크 I/O가 줄어들어 성능이 개선되게 된다.

1) PK에 의해 테이블을 분할하는 경우(파티셔닝)

👉 하나의 테이블에 많은 양의 데이터가 저장되면 인덱스를 추가하고 테이블을 몇개로 쪼개도 성능이 저하되는 경우가 있다.
👉 이때 논리적으로는 하나의 테이블이지만 물리적으로는 여러 개의 테이블로 분리하여 데이터 액세스 성능도 향상시키고 데이터 관리 방법도 개선할 수 있도록 테이블에 적용하는 기법이다.

① RANGE PARTITION

👉 대상 테이블이 날짜 또는 숫자값으로 분리가 가능하고 각 영역별로 트랜잭션이 분리되는 경우

📌 예제) RANGE PARTITION 적용

② LIST PARTITION

👉 지점, 사업소 등 핵심적인 코드값으로 PK가 구성되어 있고 대량의 데이터가 있는 테이블의 경우

③ HASH PARTITION

👉 지정된 HASH조건에 따라 해시 알고리즘이 적용되어 테이블이 분리

2) 테이블에 대한 수평/수직분할 절차

  1. 데이터 모델링을 완성한다.
  2. DB 용량산정을 한다.
  3. 대량 데이터가 처리되는 테이블에 대해 트랜잭션 처리 패턴을 분석한다.
  4. 칼럼 단위로 집중화된 처리가 발생하는지, 로우 단위로 집중화된 처리가 발생하는지 분석하여 집중화된 단위로 테이블을 분리하는 것을 검토한다

5. 2장 5절 데이터베이스 구조와 성능

1) 슈퍼/서브타입 모델

👉 업무를 구성하는 데이터의 특징을 공통점과 차이저므이 특징을 고려하여 효과적으로 표현한다.

  • 변환방법
  1. OneToOne Type (1:1 타입)
    : 개별로 발생되는 츠랜잭션에 대해서는 개별 테이블로 구성한다.

  2. Plus Type(슈퍼 + 서브타입)
    : 슈퍼타입 + 서브타입에 대해 발생되는 트랜잭션에 대해서는 슈퍼 + 서브타입 테이블로 구성한다.

  3. Single Type, All in One Type
    : 전체를 하나로 묶어 트랜잭션이 발생할 때는 하나의 테이블로 구성한다.

2) 인덱스 특성을 고려한 PK/FK DB 성능향상

👉 인덱스의 특징은 여러 개의 속성이 하나의 인덱스로 구성되어 있을 때 앞쪽에 위치한 속성의 값이 비교자로 있어야 좋은 효율을 나타낸다.
👉 앞쪽에 위치한 속성의 값이 가급적 ‘=’ 아니면 최소한 범위 ‘BETWEEN’ ‘<>’ 가 들어와야 효율적이다.

👉 데이터를 조회할 때 가장 효과적으로 처리될 수 있는 접근경로로 제공하는 오브젝트가 인덱스인데 일반적으로 데이터베이스 테이블에서는 균형잡힌 트리구조의 'B*Tree' 구조를 많이 사용한다.
👉 인덱스가 정렬되어 있다는 특징에 따라 데이터베이스 설계에 반영해야할 요소에 대해서 알고있는 것은 좋은 데이터 모델을 만들어 낼 수 있게 한다.
👉 프로젝트에서 PK/FK설계는 업무적으로도 매우 중요한 의미를 가지고 있지만 데이터를 접근할때 경로를 제공하는 성능의 측면에서도 중요한 의미를 가지고 있기 때문에 성능을 고려한 데이터베이스 설계가 될 수 있도록 설계단계 말에 칼럼의 순서를 조정할 필요가 있다.

📌 예제) PK순서를 잘못 지정하여 성능이 저하된 경우 1
입시마스터라는 테이블의 PK는 수험번호+년도+학기로 구성되어 있고 전형과목실적 테이블은 입시마스터 테이블에서 상속받은 수험번호+년도+학기에 전형과목코드로 PK가 구성되어 있는 복합식별자 구조의 테이블이다.
입시마스터에는 200만 건의 테이터가 있고 학사는 4학기로 구성되어 있고 데이터는 5년간 보관되어 있다. 그러므로 한 학기당 평균 2만 건의 데이터가 있다거 가정한다.

입시마스터 테이블에 데이터를 조회할 때 년도와 학기에 대한 내용이 빈번하게 들어오므로 다음과 같이 PK의 순서를 변경함으로써 인덱스를 이용가능하도록 할 수 있다.

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

거래일자+사무소코드로 구성된 그림을 보면 BETWEEN 비교를 한 거래일자 '20080701'이 인덱스 앞에 위치하기 때문에 범위가 넓어졌고 사무소코드+거래일자로 구성된 인덱스의 경우 '=' 비교를 한 사무소 코드 '00368'이 인덱스 앞에 위치하여 범위가 좁아졌다.

📌 예제) FK제약이 걸려있지 않은 경우
물리적인 테이블에 FK를 사용하지 않아도 데이터 모델 관계에 의해 상속받은 FK 속성들은 SQL WHERE절에서 조인으로 이용되는 경우가 만히 있으므로 FK 인덱스를 생성해야 성능이 좋은 경우가 빈번하다.
다음은 학사기준번호가 수강신청 테이블의 키에 포함되지는 않지만 조인에 쓰이는 경우이다.

인덱스를 생성하여 성능저하를 예방한다.

6. 2장 6절 분산 데이터베이스와 성능

1) 분산 데이터베이스

👉 여러 곳을 분산되어 있는 DB를 하나의 가상 시스템으로 사용할 수 있도록 한 데이터베이스이다.
👉 논리적으로 동일한 시스템에 속하지만 컴퓨터 네트워크를 통해 물리적으로 분산되어 있는 데이터 집합이다.

  • 투명성
  1. 분할 투명성 (단편화)
    : 하나의 논리적 relation이 여러 단편으로 분할 되어 각 단편의 사본이 여러 site에 저장

  2. 위치 투명성
    : 사용하려는 데이터의 저장 장소 명시 불필요,
    위치 정보가 시스템 카탈로그에 유지되어야 함

  3. 지역사상 투명성
    : 지역 DBMS와 물리적 DB 사이의 mapping 보장,
    각 지역 시스템 이름과 무관한 이름 사용 가능

  4. 중복 투명성
    : DB 객체가 여러 site에 중복되어 있는지 알 필요가 없는 성질

  5. 장애 투명성
    : 구성요소(DBMS, computer)의 장애에 무관한 transaction의 원자성 유지

  6. 병행 투명성
    : 다수 transaction 동시 수행 시 결과의 일관성 유지, TimeStamp, 분산 2단계 locking 이용 구현

  • 장단점
  1. 장점
    • 지역 자치성, 점증적 시스템 용량 확장
    • 신뢰성, 가용성
    • 효용성과 융통성
    • 빠른 응답 속도와 통신 비용 절감
    • 데이터 가용성과 신뢰성 증가
    • 시스템 규모의 적절한 조절
    • 각 지역 사용자의 요구 수용 증대
  2. 단점
    • 소프트웨어 개발 비용
    • 오류의 잠재성 증대
    • 처리 비용의 증대
    • 설계, 관리의 복잡성
    • 불규칙한 응답 속도
    • 통제의 어려움
    • 데이터 무결성에 대한 위협

2) 분산 데이터베이스 적용기법

① 테이블 위치 분산

👉 설계된 테이블을 본사와 지사 단위로 분산한다.

② 테이블 분할 분산

👉 각각의 테이블을 쪼개서 분산한다.

  • 수평 분할
    : 지사에 따라 테이블을 특정 칼럼의 값을 기준으로 로우를 분리한다. 칼럼은 분리되지 않는다. 모든 데이터가 각 지사별로 분리되어 있는 형태를 가지고 있다.
    각 지사에 있는 데이터와 다른 지사에 있는 데이터와 항상 배타적으로 존재하며, 데이터를 한 군데 집합시켜 놓아도 primary key에 의해 중복이 발생되지 않는다.

  • 수직 분할
    : 지사에 따라 테이블을 특정 칼럼의 값을 기준으로 칼럼을 분리한다. 로우 단위로는 분리되지 않는다. 모든 데이터가 각 지사별로 분리되어 있는 형태를 가지고 있다.
    칼럼을 기준으로 분할하였기 때문에 각각의 테이블에는 동일한 primary key 구조와 값을 가지고 있어야 한다.

③ 테이블 복제 분산

👉 동일한 테이블을 다른 지역이나 서버에서 동시에 생성하여 관리하는 유형이다.

  • 부분 복제
    : 마스터 DB에서 테이블의 일부의 내용만 다른 지역이나 서버에 위치한다.
    통합된 테이블을 한군데(본사)에서 가지고 있으면서 각 지사별로는 지사에 해당된 로우를 가지고 있는 형태이다.
    지사에 존재하는 데이터는 반드시 본사에 존재하게 된다. 즉, 본사의 데이터는 지사데이터의 합이다.
    각 지사에서 데이터 처리가 용이할 뿐만 아니라 저네 데이터에 대한 통합처리도 본사에 있는 통합 테이블을 이용하게 되므로 여러 테이블에 조인이 발생하지 않는 빠른 작업 수행이 가능 해진다.

  • 광역 복제
    : 마스터 DB 테이블의 내용을 각 지역이나 서버에 존재시킨다.
    합된 테이블을 한 군데(본사)에서 가지고 있으면서 각 지사에도 본사와 동일한 데이터를 모두 가지고 있는 형태이다.
    지사에 존재하는 데이터는 반드시 본사에 존재하게 된다. 모든 지사에 있는 데이터량과 본사에 있는 데이터량이 다 동일하다.
    본사와 지사 모두 동일한 정보를 가지고 있으므로 본사나 지사나 데이터 처리에 특별한 제약을 받지는 않는다.

④ 테이블 요약 분산

👉 지역 간에 또는 서버 간에 데이터가 비슷하지만 서로 다른 유형으로 존재하는 경우이다.

  • 분석 요약
    : 동일한 테이블 구조를 가지고 있으면서 분산되어 있는 동일한 내용의 데이터를 이용하여 통합된 데이터를 산출하는 방식이다.

  • 통합 요약
    : 분산되어 있는 다른 내용의 데이터를 이용하여 통합된 데이터를 산출하는 방식이다.

3) 분산 데이터베이스 설계를 고려해야 하는 경우

  1. 성능이 중요한 사이트
  2. 공통코드, 기준정보, 마스터 데이터의 성능향상
  3. 실시간 동기화가 요구되지 않는 경우, 거의 실시간의 업무적인 특징을 가지고 있는 경우
  4. 특정 서버에 부하가 집중되어 부하를 분산
  5. 백업 사이트 구성하는 경우

📄출처 : 덕성여대 wiset SQLD 자격증 특강 강의자료

좋은 웹페이지 즐겨찾기