3. 반정규화 (De-Normalization)

1) 반정규화

- 데이터베이스의 성능 향상을 위하여 데이터의 중복을 허용하고 조인을 줄이는 성능향상 방법

- 조회속도를 향상시키나 데이터 모델의 유연성은 낮아짐

- 무결성을 지킬 수 있는 방법으로 시행!


2) 반정규화 수행하는 경우

- 정규화에 충실하면 종속성 활용성은 향상되나, 수행 속도가 느려지는 경우

- 다량의 범위를 자주 처리하는 경우

- 특정 범위 데이터만 자주 처리하는 경우

- 요약/집계 정보가 자주 요구되는 경우


* 반정규화 절차

대상 조사 및 검토

 - 데이터 처리 범위, 통계성 등을 확인해 조사 

다른 방법 검토

 - 반정규화 수행 전 다른 방법 있는지 검토

 - 클러스터링, 뷰, 인덱스 튜닝, 응용 프로그램, 파티션 등을 검토 

반정규화 수행

 - 테이블, 속성, 관계 

* 클러스터링 : 클러스터링 인덱스.. 인덱스 정보를 저장할 떄 물리적으로 정렬해서 저장하는 방법

조회 시 인접 블록을 연속적으로 읽기 떄문에 성능이 향상됨


3) 반정규화 기법

(1) 테이블 반정규화

테이블 병합 

 1:1관계 테이블 병합 

 

 1:N관계 테이블 병합

 

 수퍼/서브타입 테이블 병합

- 슈퍼 타입과 서브 타입 관계가 발생하면 테이블을 통합 (부모 자식 간의 관계)

 테이블 분할

 수직 분할 

- 칼럼을 분할하여 새로운 테이블을 만듬 (기본키를 가져감)

 수평 분할

- 로우 단위로 집중 발생되는 트랜잭션을 분석하여 특정 값을 기준으로 하나의 테이블을 분할

테이블 추가

 중복 테이블 추가

- 다른 업무 이거나 서버가 다른 경우 동일한 테이블 구조를 중복, 원격 조인 제거

 통계 테이블 추가

- SUM, AVG 등 미리 수행해 계산해 둠으로 조회 시 성능 향상 

 이력 테이블 추가

- 마스터 테이블이 존재하는 레코드를 중복 

 부분 테이블 추가

- 자주 이용하는 집중화된 칼럼을 모아놓은 별도의 테이블 생성 

* 슈퍼타입 및 서브타입 변환 방법

 OneToOne Type

 - 슈퍼 타입과 서브 타입을 개별 테이블로 도출 (개별테이블 유지)

 - 확장성 우수하나 조인 성능이 나쁨

 - 테이블 수가 많아 조인이 많이 발생, 관리 어려움, IO 성능이 좋음

 - 개별 테이블로 접근이 많은 경우 선택

 Plus Type

 - 슈퍼 타입 + 서브 타입 테이블로 도출

 - 확장성은 보통이고 조인성능이 나쁨

 - 조인이 발생하고 관리 어려움, IO 성능이 좋음

 - 슈퍼+서브 형식으로 데이터를 처리하는 경우 선택

 Single Type 

 - 슈퍼 타입과 서브 타입을 하나의 테이블로 도출

 - 확장성은 나쁘나 조인성능이 우수함

 - 조인 성능이 좋고 관리가 편함, IO 성능이 나쁨 

 - 전체를 일괄적으로 처리하는 경우 선택


* 파티션 기법 : 논리적으로는 하나의 테이블이지만 여러 개의 데이터 파일에 분산되어 저장하는 기법

Range Partition : 데이터값의 범위를 기준으로 파티션 수행

List Partition : 특정 값을르 지정하여 파티션 수행

Hash Partition : 해시함수 적용하여 파티션 수행

Composite Partition : 범위와 해시를 복합적으로 사용하여 파티션 수행

 - 파티션 테이블의 장점 : 조회 시 엑세스 범위가 줄어듬

데이터 분할되어 있으므로 IO성능 향상

각 파티션 독립적 백업, 복구 가능

(2) 칼럼 반정규화

 중복칼럼 추가

- 조인 처리시 성능저하 방지

- 조인을 감소시키기 위해 중복된 칼럼을 위치시킴 

 파생칼럼 추가

- 트랜잭션 처리시 성능저하 방지 

- 미리 값을 계산하여 칼럼에 보관

 이력테이블 칼럼 추가

- 대량의 이력데이터 처리시 발생할 성능저하 방지

- 이력테이블에 기능성 칼럼(최근값 여부, 시작과 종료일자 등) 추가 

 PK에 의한 칼럼 추가

- 복합 의미 갖는 PK를 단일속성으로 구성하였을 때 발생하는 성능저하 방지

- 이미 PK안에 데이터가 존재하나 성능향상을 위해 일반 속성으로 포함하는 방법 

 응용시스템 오작동을

 위한 칼럼 추가

- 데이터 처리중 잘못하여 원래 값으로 복구하기 원할 경우 이전 데이터를 임시적으로 중복하여 보관하는 기법 


(3) 관계 반정규화

중복관계 추가

- 추가적인 관계를 맺어 조인시 성능저하  


* 성능 데이터 모델링

- 데이터베이스 성능향상을 목적으로 설계단계의 데이터 모델링 때부터 정규화, 반정규화, 테이블통합, 테이블분할, 조인구조, PK, FK 등 여러 가지 성능과 관련된 사항이 데이터 모델링에 반영될 수 있도록 하는 것

- 성능 분석/설계 단계에서부터 성능에 대한 데이터모델 설계를 하지 않으면 시간이 지날수록 성능개선 비용이 증가

- 고려사항 

데이터 모델링을 할 때 정규화를 정확하게 수행


데이터베이스 용량산정을 수행


데이터베이스에 발생되는 트랜잭션의 유형을 파악


용량과 트랜잭션의 유형에 따라 반정규화를 수행


이력모델의 조정, PK/FK조정, 슈퍼타입/서브타입 조정 등을 수행.


성능관점에서 데이터 모델을 검증


1. 정규화 (Normalization)

1) 정규화

- 데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성, 모델의 독립성을 확보하기 위한 데이터 분해 과정

- 제 1 정규화 ~ 제 5 정규화 까지 있지만 보통 제 3 정규화까지만 수행

- 정규화된 모델은 테이블이 분해됨. 분해된 테이블은 조인(Join)을 수행하여 하나의 합집합으로 만들수도 있음!


* 함수적 종속성 : 결정자 x -> 종속자 Y 이면 Y는 X에 함수적으로 종속한다.

X가 변화하면 Y도 변화하는지 확인해본다.


* 정규화 절차 (도부이결다조!) -> 함수적 종속성을 따짐

제1정규화 

 - 속성의 원자성을 확보 (도메인 원자값!) 

 - 기본키 설정 

 도메인 값을 원자값으로 만들고
 기본키를 찾아 기본키 설정!

 제2정규화

 - 기본키가 2개 이상의 속성으로 이루어질 경우 수행

 - 부분 함수 종속성을 제거(분해) 

 부분 함수 종속 : 기본키가 2칼럼일 때 속성이 한 칼럼에서 충분히 함수 종속적일 때

 제3정규화

 - 기본키를 제외한 칼럼 간의 종속성 제거

 - 이행 함수 종속성 제거 

 이행 함수 종속 : 기본키 제외하고 칼럼 간 종속   발생하는 것. A->B B->C A->C 이런 경우.

 BCNF

 - 기본키를 제외하고 후보키가 있는 경우, 후보키가 기본키를 종속시키면 분해

 결정자 아닌 후보키 제거  

 제4정규화

 - 다치 종속 제거

 - 여러 칼럼들이 하나의 칼럼을 종속시키는 경우 분해하여 다중값 종속성을 제거 

 

 제5정규화

 - 조인에 의해 종속성이 발생되는 경우 분해 (조인 종속 제거) 

 


2. 정규화의 성능

1) 정규화의 문제점

- (장.. 점...)정규화는 테이블을 분해해서 데이터 중복을 제거 -> 유연성이 높아짐

- 따라서, 데이터 조회(Select)시에 조인(Join)유발 -> CPU와 메모리 많이 사용


2) 성능 튜닝

- 정규화의 조인으로 성능이 떨어진 것을 해결

① 인덱스와 옵티마이저 사용..

② 반정규화 하여 하나의 테이블에 저장하여 조인을 막음 (그러나 반정규화도 문제점을 발생시킴)

1. 뷰의 개념

- 하나 이상의 기본 테이블에서 유도되는 가상 테이블

저장장치 내에 물리적으로 존재 X, BUT 사용자에게는 있는 것처럼 보임

- 뷰 생성 -> 뷰 정의가 시스템 내에 저장되었다가 생성된 뷰의 이름을 질의어에서 사용할 경우 질의어가 실행될

때 뷰에 정의된 기본 테이블로 대체되어 기본 테이블에 대해 실행

 

2. 뷰의 특징

- 기본 테이블에서 유도된 테이블인 뷰. -> 기본 테이블과 같은 형태, 유사한 조작

- 물리적으로 구현되어 있지 않음

- 필요한 데이터만을 뷰로 정의해서 처리할 수 있기 때문에 관리 용이, 명령문이 간단

- 뷰를 통해서만 데이터에 접근 -> 뷰에 나타나지 않은 데이터를 안전히 보호 가능

- 기본 테이블의 기본키를 포함한 속성 집합으로 뷰를 구성해야만 삽입, 삭제, 갱신 연산 가능

- 정의된 뷰는 다른 뷰의 정의에 기초가 될 수 있음

 

3. 뷰 연산 시의 제약성

- 뷰의 열이 테이블이 열이 아닌 상수, 계산식, 그룹 함수를 사용해 만들어진 뷰는

- DISTINCT(중복제거), GROUP BY, HAVING을 사용해 만들어진 뷰는

- 둘 이상의 테이블에서 유도된 뷰는

- 변경하지 못하는 뷰를 토대로 하여 생성된 뷰는

변경 불가능

 

 

 

4. CREATE VIEW

CREATE VIEW 뷰명[(속성명, 속성명 ...)]

AS SELECT

[WITH CHECK OPTION] ;

AS SELECT: ORDER BY, UNION 사용 불가함

WITH CHECK OPTION : 뷰에 대한 갱신이나 삽인 연산이 실행될 때 뷰의 정의 조건을 위배하면 실행 거부

속성명 없으면 SELECT 문 속성명이 자동으로 뷰 속성으로 됨

 

5. DROP VIEW

DROP VIEW 뷰명 [CASCADE | RESTRICT];

CASCADE : 뷰 참조하는 다른 뷰나 제약조건까지 모두 제거

RESTRICT : 뷰를 다른 곳에서 참조하고 있으면 제거가 취소

 

1. DCL의 개념

데이터의 보안무결성회복병행제어 등을 정의하는데 사용하는 언어

데이터베이스 관리자가 데이더 관리를 목적으로 사용하는 언어

COMMIT

데이터베이스 조작 작업을 영구적으로 반영하여 완료

ROLLBACK

데이터베이스 조작 작업이 비정상적으로 종료되어 다시 원래 상태로 복구

GRANT

데이터베이스 사용자에게 사용 권한 부여

REVOKE

데이터베이스 사용자의 사용 권한을 취소

 

2. COMMIT / ROLLBACK

1) COMMIT

트랜잭션의 모든 변경내용들을 영구적으로 데이터베이스에 반영하는 명령어

트랜잭션이 성공적으로 끝나면 DB가 새로운 일관성 상태를 가지기 위해 수행된 모든 변경을 DB에 반영하여 완료(COMMIT)하여야 함


트랜잭션

하나의 논리적 기능을 수행하기 위한 일련의 연산 집합작업의 단위

회복 및 병행 제어 시에 처리되는 작업의 논리적 단위

하나의 트랜잭션은 COMMIT 되거나 ROLLBACK 되어야 함

 

2) ROLLBACK

변경된 모든 내용들을 취소하고 DB를 이전상태로 되돌리는 명령어

트랜잭션의 일부를 성공적으로 끝내지 못하면 DB가 비일관성인 상태를 가질 수 있으므로 (트랜잭션이 수행한 일부 변경이 DB에 반영될 가능성이 

있기 때문에일부분만 완료된 트랜잭션은 롤백(ROLLBACK) 되어야 함


3. GRANT / REVOKE

- GRANT : 권한 부여를 위한 명령어

- REVOKE : 권한 취소를 위한 명령어

자기 자신에게 권한이 없어지면 해당 권한을 다른 사람에게 부여할 수 없음!!

1. 사용자 등급 지정 및 해제


GRANT 사용자등급 TO 사용자_ID_리스트[IDENTIFIED BY 암호];

REVOKE 사용자등급 FROM 사용자_ID_리스트;


사용자 등급

DBA : 데베 관리자 / RESOURCE : 데베 및 테이블 생성 가능자 / CONNECT : 단순 사용자

2. 테이블 및 속성에 대한 권한 부여 및 취소


GRANT 권한_리스트 ON 개체 TO 사용자 [WITH GRANT OPTION] ;

REVOKE [GRANT OPTION FOR] 권한_리스트 ON 개체 FROM 사용자 [CASCADE] ;


권한 종류 ; ALL, INSERT, DELETE, UPDATE, ALTER 

WITH GRANT OPTION : 부여받은 권한을 다른 사용자에게 다시 부여할 수 있는 권한을 부여

GRANT OPTION FOR : 다른 사용자에게 권한을 부여할 수 있는 권한을 취소

CASCADE : 권한 취소 시 권한을 부여받았던 사용자가 다른 사용자에게 부여한 권한도 연쇄적으로 취소

 

1. DML의 개념

데이터베이스 사용자가 응용 프로그램이나 질의어를 통해 저장된 데이터를 실질적으로 관리하는데 사용되는 언어

데이터베이스 사용자와 데이터베이스 관리시스템 간의 인터페이스를 제공

 

2. INSERT

INSERT INTO 테이블명 [(속성명1, 속성명2..)]

VALUES(데이터 1, 데이터 2..);

- 대응하는 속성과 데이터는 개수와 데이터 타입 일치해야 함

테이블 모든 속성 삽입 시 속성명 생략 가능(순서대로)

SELECT문 결과를 삽입 가능

INSERT INTO 편집부원(이름, 생일, 주소, 기본급)

SELECT 이름, 생일, 주소, 기본급 FROM 사원 WHERE 부서=‘편집’;

 

 

3. DELETE

DELETE FROM 테이블명 WHRER 조건;

조건절 만족하는 특정 튜플 삭제

모든 튜플 삭제 시 WHERE절 생략

 

4. UPDATE

갱신

UPDATE 테이블명

SET 속성명=데이터[속성명=데이터...]

WHERE 조건;

UPDATE 사원 SET 주소=‘퇴계동’ WHERE 이름=‘홍길동’;

UPDATER 사원 SET 부서 =‘기획’. 기본급=기본급+5

WHERE 이름=‘황진이’;


1. JOIN의 개념

- 2개의 테이블에 대해 연관 튜플들을 결합하여 하나의 새로운 릴레이션 반환

일반적으로 FROM 절에 기술릴레이션 사용되는 어느 곳에서나 사용 가능하며 보통 WHERE 절을 이용

 

2. INNER JOIN

1) EQUI 조인

- JOIN 대상 테이블에서 공통 속성을 기준으로 비교에 의해 같은 값 가지는 행 연결하여 결과 생성

- NATURAL JOIN : JOIN조건이 일 때 동일한 속성이 두 번 나타는데그것을 제거하여 한번만 표기

- JOIN 속성 연결 고리가 되는 공통 속성

 

(1) WHERE 절 이용

SELECT [테이블명1.]속성명, [테이블명2.]속성명,..

FROM 테이블명1, 테이블명2 ...

WHERE 테이블명1.속성명 테이블명2.속성명 ;


(2) NATURAL JOIN

SELECT [테이블명1.]속성명, [테이블명2.]속성명,...

FROM 테이블명1 NATURAL JOIN 테이블명 2 ;


NATURAL JOIN은 조인할 속성을 지정하지 않으므로

두 테이블에 이름과 도메인이 같은 속성이 반드시 존재해야 함

(3) JOIN ~ USING 절 이용

SELECT [테이블명1.]속성명, [테이블명2.]속성명,...

FROM 테이블명1 JOIN 테이블명2 USING(속성명) ;

 

2) NON – EQUI JOIN

- JOIN 조건에 조건이 아닌 비교연산자 사용하는 JOIN

SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...

FROM 테이블명1, 테이블명2, ...

WHERE NON-EQUI JOIN 조건(비교연산) ;

 

3. OUTER JOIN

- JOIN 조건에 만족하지 않는 튜플도 결과로 출력하기 위한 방법

- INNER JOIN 결과를 구한 후 뒤에 OUTER JOIN 한 결과를 추가함


1) LEFT OUTER JOIN

우측항 릴레이션의 어떠한 튜플과도 맞지 않는 좌측 항 릴레이션에 있는 튜플들에 우측항 속성 튜플 값을 NULL로 붙임

좌측 릴레이션이 기준이 되어 좌측 릴레이션에 있는 튜플은 모두 표시하고 우측 릴레이션에서는 관련 있는 튜플만 표시

 

SELECT [테이블명1.]속성명, [테이블2.]속성명, ...

FROM 테이블명1 LEFT OUTER JOIN 테이블명2

ON 테이블명1. 속성명 테이블명2. 속성명 ;

SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...

FROM 테이블명1테이블명2

WHERE 테이블명1. 속성명 테이블명2. 속성명(+) ;

 

2) RIGHT OUTER JOIN

좌측항 릴레이션의 어떠한 튜플과도 맞지 않은 우측 항의 릴레이션에 있는 튜플들에 좌측항 속성 튜플 값을 NULL로 붙임

우측 릴레이션이 기준이 되어 우측 릴레이션에 있는 튜플은 모두 표시하고 좌측 릴레이션에서는 연관된 튜플만 표시


SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...

FROM 테이블명1 RIGHT OUTER JOIN 테이블명2

ON 테이블명1, 속성명 테이블명2. 속성명 ;

SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...

FROM 테이블명1, 테이블명2

WHERE 테이블명1. 속성명(+) = 테이블명2. 속성명


* LEFT OUTER JOIN 과 RIGHT OUTER JOIN 은 FROM절 테이블 위치만 서로 바뀌면 같은 결과를 가져옴

 

3) FULL OUTER JOIN

- LEFT OUTER JOIN + RIGHT OUTER JOIN

SELECT [테이블명1.]속성명, [테이블명2.]속성명, ...

FROM 테이블명1 FULL OUTER JOIN 테이블명2

ON 테이블명1. 속성명 테이블명2. 속성명 ;

 

4. SELF JOIN

같은 테이블에서 2개의 속성을 연결하여 EQUI JOIN 하는 것


SELECT [별칭1.]속성명, [별칭1.]속성명,...

FROM 테이블명1 [AS] 별칭1 JOIN 테이블명2 [AS] 별칭2

ON 별칭1.속성명 별칭2.속성명 ;

SELECT [별칭1.]속성명, [별칭1.]속성명, ...

FROM 테이블명1 [AS] 별칭1, 테이블명[AS] 별칭2

WHERE 별칭1,속성명 별칭2.속성명 ;



테이블 1의 속성 하나가 테이블1의 또 다른 속성 하나랑 연결될 때 테이블 하나에 별칭을 2개 달아서 같은 테이블을 두 개로 복사해서 본다고 생각하고 대응시키면 됨

 


+ Recent posts