데이터베이스의 성능 향상을 목적 으로 데이터 모델 설계 시점부터 정규화, 반정규화, 테이블 통합, 테이블 분할, 조인 구조, PK, FK 등 여러가지 성능과 관련괸 사항들이 데이터 모델링 작업에 반영될 수 있도록 하는 것 을 의미한다.
분석 / 설계 단계
정규화를 수행한다는 것 은 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반 속성을 의존자로 하여 입력/수정/삭제 이상현상을 제거 하는 것
정규화된 테이블에 대한 데이터 조회 시에는 성능의 향상 혹은 저하가 일어나고 입력, 수정, 삭제 시에는 성능이 향상됨
함수적 종속성 등과 같은 이론에 근거하여 관계형 데이터베이스 테이블의 삽입/삭제/갱신 이상 현상 발생을 최소화하기 위해 좀 더 작은 단위의 테이블로 설계하는 과정
-> 정규화는 데이터 모델을 정규형에 맞도록 고치는 과정
정규화 결과에 의해 도출된 데이터 모델이 갖춰야 할 특성을 만족한 형태
-> 정규화한 결과
테이블의 특정 칼럼 A의 값을 알면 다른 칼럼 B의 값을 알 수 있을 때, 칼럼 B는 칼럼 A에 함수적 종속성이 있다고 한다.
ex) 주민번호를 알면 고객명을 알 수 있을 때
"고객명은 주민등록번호에 함수적 종속성이 있다."
위의 함수적 종속성 설명에서 칼럼 A를 결정자라고 한다.
-> 주민번호는 고객명을 결정하므로 고객명의 결정자이다.
결정자 칼럼 A에 의해 칼럼 B의 값을 다수 개 알 수 있을 때, 칼럼 B는 칼럼 A에 다치종속되었다고 한다.
ex) 학번을 통해 해당 학생이 수강신청한 다수 개의 수강과목을 알 수 있을 때
"수강과목은 학번에 다치종속된다."
정규화 유형 | 설명 |
---|---|
1차 정규화 | - 한 속성에 여러 개의 속성값을 갖거나 같은 유형의 속성이 여러 개인 경우 해당 속성을 분리시킨다. - 1차 정규화 작업으로 속성의 원자성을 확보하게 된다. |
2차 정규화 | - 주식별자에 완전 함수 종속되지 않은 속성을 분리한다. - 2차 정규화 작업으로 부분 종속 속성이 된 속성을 분리한다. |
3차 정규화 | - 일반 속성끼리 함수 종속이 발생한 속성을 분리한다. - 3차 정규화 작업으로 이행적 종속 속성을 분리한다. |
보이스-코드 정규화 | - 결정자 안에 함수 종속을 가진 주식별자 속성을 분리한다. |
4차 정규화 | - 다가 종속 속성을 별도의 엔터티로 분리한다. |
5차 정규화 | - 결합 종속일 경우는 2개 이상의 엔터티로 분리한다. |
한 속성에 여러 개의 속성값을 갖거나 같은 유형의 속성이 여러 개인 경우 해당 속성을 분리시켜야 함을 뜻한다.
제1정규형을 만족하고 모든 PK가 아닌 칼럼은 PK 전체에 종속되어야 한다. PK에 종속적이지 않거나 PK 중 일부 칼럼(들)에만 종속적인 칼럼은 분리되어야 하는 것을 뜻한다.
- 갱신이상 문제점을 방지
- 복합식별자의 일부 칼럼에만 함수 종속하는 속성을 없앤다.
제2정규형을 만족하고 일반 속성들 간에도 함수 종속 관계가 존재하지 않아야 하고, 일반 속성들 간 종속 관계가 존재하는 것들은 분리되어야 하는 것을 뜻한다.
🚫위반
1. 식별자를 제외한 일반 속성 간에 함수 종속이 발생하는 경우
데이터들이 어떤 기준값(결정자)에 의해 종속되는 현상을 지칭하는 것
- 기준값 = 결정자
- 종속되는 값 = 종속자
종속자는 함수적으로 종속성을 가지게 되며, 종속자는 결정자에 의해서 결정된다.
함수적 종속성을 만족시키는 작업
일반적으로 데이터를 고의적으로 중복 저장하여 조회 성능을 향상시키기 위한 기법
→ 데이터를 중복 저장함으로써 조인 연산이 회피되어 성능이 향상됨
넓은 의미 로 조회 성능을 향상시키기 위해 정규화된 데이터 모델에서 중복, 통합, 분리 등을 수행하는 모든 과정을 의미
데이터 무결성이 깨질 수 있는 위험을 무릅쓰고 데이터를 중복하여 반정규화를 적용하는 상황
1. 데이터를 조회할 때 디스크 I/O량이 많아서 성능이 저하되는 경우
2. 테이블 간 경로가 너무 멀어 조인으로 인한 성능 저하가 예상되는 경우
3. 컬럼을 계산하여 읽을 때 성능이 저하될 것이 예상되는 경우
: 여러 개의 테이블을 하나의 테이블로 합치는 것
기법 | 설명 |
---|---|
1:1 관계 테이블 병합 | - 1:1 관계를 통합하여 성능을 향상시키는 방법이다. - 2개의 테이블을 하나의 테이블로 병합하여 테이블 간 조인 연산을 제거한다. |
1:M 관계 테이블 병합 | - 1:M 관계를 통합하여 성능을 향상시키는 방법이다. - 2개의 테이블을 하나의 테이블로 병합하여 테이블 간 조인 연산을 제거한다. |
슈퍼/서브 타입 테이블 병합 | - 슈퍼/서브 관계를 통합하여 성능을 향상시키는 방법이다. - 슈퍼/서브 타입 관계를 하나의 테이블로 병합하여 조인 연산을 제거한다. |
: 특정 테이블을 여러 개의 테이블로 쪼개는 것
기법 | 설명 |
---|---|
수직 분할 | - 칼럼 단위의 테이블을 디스크 I/O 분산 처리하기 위해 테이블을 1:1로 분리하여 성능을 향상시키는 방법으로 트랜잭션이 처리되는 유형 파악이 선행되어야 한다. ex) 게시글 테이블의 조회수 칼럼은 업데이트가 빈번하게 일어나므로 게시글의 조회수 저장용 테이블을 하나 더 만들어서 관리한다. |
수평 분할 | -로우 단위로 집중 발생되는 트랜잭션을 분석하여 디스크 I/O 및 데이터 접근효율을 높여 성능을 향상 하기 위해 로우 단위로 테이블을 쪼개는 방법이다. ex) 요금납부 테이블을 각 년원별 요금납부 테이블로 분할한다. |
: 특정 테이블을 추가하여 데이터의 중복 저장이라는 비효율이 발생하는 것을 감안하더라도 조회 성능을 높이기 위한 방법
기법 | 설명 |
---|---|
중복 테이블 추가 | - 다른 업무이거나 서버가 다른 경우 동일한 테이블 구조를 중복하여 원격 조인을 제거하여 성능을 향상시킨다. |
통계 테이블 추가 | - SUM, AVG 등을 미리 수행하여 계산해둠으로써 조회 시 성능을 향상시킨다. |
이력 테이블 추가 | - 이력 테이블 중에서 마스터 테이블에 존재하는 레코드를 중복하여 이력 테이블에 저장하는 반정규화 기법이다. |
부분 테이블 추가 | - 특정 테이블에서 전테 칼럼 중 자주 이용(조회)하는 집중화된 칼럼들이 있을 때, 디스크 I/O 를 줄이기 위해 해당 칼럼들을 모아놓은 별도의 반정규화된 테이블을 생성한다. |
: 특정 칼럼을 추가하여 데이터 모델 내에서 중복으로 데이터가 저장되지만, 조회 성능을 향상시킬 수 있는 방법
기법 | 설명 |
---|---|
중복 칼럼 추가 | - 조인 연산으로 인한 성능 저하를 예방하기 위해 중복 칼럼을 추가하여 조인 연산을 하지 않도록 한다. ex) 인사 테이블과 부서 테이블을 조인하여 부서 테이블에 있는 부서명 칼럼을 조회할 때, 부서명 칼럼을 인사 테이블에도 중복으로 관리하여 부서 테이블을 조인하지 않고 인사 정보를 조회한다. |
파생 칼럼 추가 | - 트랜잭션이 처리되는 시점에 계산에 의해 발생되는 값의 성능 저하를 예방하기 위해 미리 값을 계산하여 칼럼에 보관한다. ex) 총매출금액 |
이력 테이블 칼럼 추가 | - 대량의 이력 데이터를 처리할 때 불특정한 날 조회나 최근 값을 조회할 때 나타날 수 있는 성능 저하를 예방하기 위해 이력 테이블에 칼럼을 추가한다. ex) 최근값여부, 시작일자, 종료일자 |
PK에 의한 칼럼 추가 | - 복합의미를 갖는 PK를 단일 속성으로 구성하였을 경우 단일 PK안에서 특정 값을 별도로 조회하는 경우 성능 저하가 발생할 수 있다. - 이때 이미 PK안에 데이터가 존재하지만 성능 향상을 위해 일반 속성으로 생성하는 방법이 PK에 의한 칼럼 추가 반정규화이다. ex) 주문번호 값의 구성이 "상품코드+주문일자(YYYYMMDD)+주문순번"으로 되어 있을 경우 주문번호 안에 존재하는 주문일자를 일반 속성으로 도출한 후 주문일자 칼럼을 인덱스 로 생성한다. |
응용 시스템의 오작동을 위한 칼럼 추가 | - 비즈니스적으로 의미가 없지만 사용자가 데이터 처리를 하다가 잘못 처리하여 원래의 값으로 복구를 원하는 경우 이전 데이터를 임시적으로 중복하여 보관하는 기법이다. - 칼럼으로 이것을 보관하는 방법은 오작동 처리를 위한 임시적인 기법이지만, 이것을 이력 데이터 모델로 풀어내면 정상적인 데이터 모델의 기법이 될 수 있다. |
: 데이터 무결성을 깨뜨릴 위험을 갖지 않고서도 데이터 처리의 성능을 향상시킬 수 있는 반정규화 기법
기법 | 설명 |
---|---|
중복 관계 추가 | 데이터를 처리하기 위한 여러 경로를 거쳐 조인이 가능하지만, 이때 발생할 수 있는 성능저하를 예방하기 위해 추가적인 관계를 맺는 방법 |
대량의 데이터가 존재하는 테이블에 많은 트랜잭션이 발생하여 성능이 저하되는 테이블 구조는 수평 / 수직 분할 설계를 통해 성능 저하를 예방할 수 있다.
: 행 단위로 분할하여 I/O를 감소시키는 방법
: 칼럼 단위로 분할하여 I/O를 감소시키는 방법
Input / Output (I/O)
- 테이블 내에 모든 행은 블록 단위로 디스크에 저장된다.
- 오라클 DBMS 기준 1개의 블록은 8,192바이트(=8킬로바이트)이다. 하나의 블록마다 8,192바이트를 저장하고 그러한 블록이 모여서 테이블의 데이터를 이루게 된다.
-칼럼이 많아지게 되면 하나의 행을 저장 시 물리적인 디스크에 여러 블록에 걸쳐 데이터가 저장될 가능성이 높아진다. 이러한 경우 하나의 행을 읽더라도 여러 개의 블록을 읽어야 한다.- 특정 테이블에서 한 행의 용량이 8,193바이트라고 가정하면 하나의 행을 읽더라도 2개의 블록을 읽게 된다. 2개의 블록을 읽었으니 총 16,384바이트를 읽게 되고 그중 8,191바이트는 버려진다.
- 자연스럽게 SQL문의 블록 I/O 의 수가 많아지게 되어 성능 저하가 일어난다.
많은 블록에 데이터가 저장되면 데이터 조회 시 절대적인 블록 I/O횟수가 많아지면 디스크 I/O (고비용의 작업으로 DBMS성능저하 유발)할 가능성도 높아진다.
로우 체이닝 (Row Chaining)
: 로우 길이가 너무 길어서 데이터 블록 하나에 데이터가 모두 저장되지 않고 2개 이상의 블록에 걸쳐 하나의 로우가 저장되어 있는 형태
로우 마이그레이션 (Row Migration)
: 데이터 블록에서 수정이 발생하면 수정된 데이터를 해당 데이터 블록에서 저장하지 못하고 다른 블록의 빈 공간을 찾아 저장하는 방식
조회대상이 아닌 칼럼은 버려지게 되어 불필요한 블록 I/O의 수가 많아지면서 자연스럽게 디스크 I/O의 양도 증가된다. 디스크 I/O가 많아지면 DBMS의 전체 성능이 저하된다.
대용량 테이블은 행의 수가 많아서 SQL문의 성능이 저하될 수 있다.
: 테이블의 저장 건수가 매우 많을 때 특정 기간으로 수평 분할하는 것
: 대용량 데이터를 특정 값에 따라 분리 저장하여 수평 분할하는 것
: 지정된 HASH 조건에 따라 해싱 알고리즘을 적용하여 테이블을 분리한다.
공통 부분을 슈퍼 타입 엔터티로 도출하고 공통으로부터 상속받아 다른 엔터티와 차이가 있는 속성에 대해서는 별도의 서브 타입 엔터티로 구분하는 방식이다.
- 업무를 구성하는 데이터의 특징을 분석하겨 공통점과 차이점을 고려하여 효과적으로 표현할 수 있다.
- 비즈니스의 모습을 정확하게 표현하면서 물리적인 데이터 모델로 변환할 때 선택의 폭을 넓힐 수 있는 장점이 있다.
방법 | 설명 |
---|---|
슈퍼 타입 기준 (Single 타입, All in One 타입) | - 슈퍼/서브 타입 모델을 하나의 테이블로 변환한 것이다. ex) 고객 테이블 하나로만 구성한다. |
서브 타입 기준 (Plus타입, Super+Sub 타입) | - 슈퍼/서브 타입을 서브 타입 테이블들로 변환한 것이다. ex) 개인고객, 법인고객 테이블로 구성한다. - 도출된 각각의 서브 타입에는 변환 전 슈퍼 엔터티에 있던 칼럼들을 공통적으로 가지고 있다. |
개별 타입 기준 (OneToOne 타입, 1:1타입) | - 슈퍼/서브 타입을 슈퍼 타입과 서브 타입의 각각 개별 테이블로 변환한 것이다. ex)고객, 개인고객, 법인고객 테이블로 구성한다. - 슈퍼 테이블, 서브 테이블 모두 생성한 것이다. |
논리 데이터 모델링 시 정의한 슈퍼/서브 타입을 물리 데이터 모델로 변환 시 적절하게 선택을 할 필요가 있다.
: 슈퍼/서브 타입 전체를 하나의 테이블로 구성하는 것을 의미한다.
슈퍼/서브 타입의 데이터를 처리 시 항상 통합하여 처리한다고 가정하면 하나의 테이블로 구성하는 것이 성능상 유리할 수 있다. 데이터를 처리할 때 항상 통합하여 처리하는데, 개별로 분리하게 되면 조인 연산 혹은 UNION ALL 연산 등이 빈번해져서 오히려 성능에 부담을 줄 수 있기 때문
슈퍼/서브 타입의 데이터 처리 시 개별로 처리하는 일이 빈번하다고 가정하면, 많은 양의 데이터를 처리하기 위해 관련된 데이터까지 모두 처리해야 하는 비효율이 발생한다. 이때, 비효율을 제거하기 위해서 서브 타입 기준으로 테이블을 변환한다.
- SQL문 성능이 향상될 가능성이 높아진다.
: 기조의 슈퍼/서브 타입을 모두 개별 테이블로 변환한 것을 의미한다.
대부분의 업무 처리가 개별로 발생한다고 가정하면, 각각에 대해 독립적으로 트랜잭션이 발생하야 당사자에 꼭 필요한 칼럼들만을 가지게 하는 것을 말한다.
구분 | 슈퍼타입 | 서브타입 | 개별타입 |
---|---|---|---|
특징 | 하나의 테이블 | 각각의 서브 타입 테이블 | 슈퍼,서브 각각의 테이블 |
확장성 | 나쁨 | 보통 | 좋음 |
조인 성능 | 우수함 | 나쁨 | 나쁨 |
I/O성능 | 나쁨 | 좋음 | 좋음 |
관리 용이성 | 좋음 | 좋지 않음 | 좋지 않음 |
트랜잭션 용이에 따른 선택 방법 | 전체를 일괄적으로 처리하는 경우 선택한다. | 각각의 서브 타입을 기준으로 처리하는 경우 선택한다. | 각각의 슈퍼,서브 타입을 기준으로 처리하는 경우 선택한다. |
: 테이블에는 기본키(PK)가 존재한다.
: 단 1개의 칼럼으로 이루어져 있음
: 인덱스의 구성 칼럼이 2개 이상인 인덱스를 의미한다.
테이블 생성 시 PK는 DBMS에서 자동으로 인덱스도 같이 생성되기 때문에 PK가 복합PK일 경우 복합PK의 칼럼 순서가 성능에 영향을 미친다.
: 여러 곳으로 분산되어 있는 데이터베이스를 하나의 가상 시스템으로 사용할 수 있도록 한 데이터베이스
: 해당 데이터베이스를 사용하는 사용자가 데이터베이스 시스템이 분산되어 있는 것을 인식하지 못하고 자신만의 데이터베이스 시스템을 사용하는 것으로 인식하도록 만드는 것
하나의 논리적 Relation(테이블)이 여러 단편으로 분할되어 각 단편의 사본이 여러 Site에 저장된다. 하지만 사용자는 한 곳에 위치하는 것으로 인식해야 한다.
사용하려는 데이터의 저장 장소를 명시할 필요가 없다. 위치정보가 System Catalog에 유지되어야 한다. 사용자는 데이터가 어디에 위치하는지에 대해 신경 쓸 필요가 없는 것이다.
지역 DBMS와 물리적 DB사이의 Mapping을 보장한다. 각 지역 시스템 이름과 무관한 이름을 사용 가능하다. 사용자가 해당 데이터 어느 지역에 위치하는지를 신경 쓸 필요가 없어야 한다.
DB객체가 여러 Site에 중복되어 있는지 사용자는 전혀 알 필요가 없는 성질이다.
구성요소의 장애에 무관한 Transaction의 원자성을 유지한다. 분산 DB의 장애상황과는 무관하게 원자성을 유지해야 한다.
다수 Transaction이 동시에 수행 시 결과의 일관성을 유지해야 한다.
(Locking과 TimeStamp방법을 주로 이용한다.)