[데이터모델링]
<데이터모델링의 순서>
- 데이터 모델에 맞게 정규화를 수행한다.
- 데이터베이스의 용량 및 트랜잭션 유형을 파악한다.
- 데이터베이스 성능을 고려하여 반정규화를 수행한다.
- PK/FK 등을 조정하여 인덱스를 반영함으로써 성능을 향상시킨다
- 데이터 모델의 성능을 검증한다.
<이상 현상>
삽입이상 : 없는 값으로 데이터를 삽입 할 수 없음
삭제이상 : 데이터 삭제 시 삭제되면 안되는 데이터까지 덩달아 삭제되는 현상
갱신이상 : 중복된 데이터 중 일부만 업데이트되어 데이터의 불일치가 발생하게 되는 현상
[정규화]
<정규화란>
데이터의 중복성을 제거하고 정확성과 일관성을 유지하고 보장하기 위해 엔터티를 작은 단위로 분리하는 과정이다.
정규화를 할 경우 데이터 조회성능은 처리조건에 따라 향상되는 경우도 있고 저하되는 경우도 있지만 , CRUD 성능은 일반적으로 향상 된다고 볼 수 있다. 하지만 그렇다고 모든 엔터티를 무작정 정규화 시키면 안되기 때문에 정규화를 하기 위한 룰이 존재한다.
<정규화 순서> - 두부이걸다조
- 제1정규형 : 도메인이 원자값이어야한다. 즉, 모든 속성은 반드시 하나의 값만 가져야 한다.
- 제2정규형 : 부분 함수 종속을 제거 해야 한다. 엔터티의 모든 일반속성은 반드시 모든 주식별자에 종속되어야 한다. 하지만 주식별자가 복합식별자인 경우 일반속성이 주식별자의 일부에서만 종속 될 수 있는데 이런 경우를 제거 해 주어야 한다.
- 제3정규형 : 이중함수 종속 제거. A -> B 이고 B -> C 라면 A를 알면 C를 알 수 있지 않니? 라는 이중적인 종속을 없어야 한다.
- BCNF : 결정자이면서 후보키가 아닌 것 제거
- 제4정규형 : 다치종속 제거
- 제5정규형 : 조인 종속 제거
[반정규화]
<반정규화란>
데이터의 조회 성능을 향상시키기 위해 데이터의 중복을 허용하거나 데이터를 그룹핑 하는 과정이다. 정규화와는 반대로 조회 성능은 향상 될 수 있으나 CUD 성능은 저하 될 수 있다. 반정규화는 정규화의 과정이 끝난 후 거치게 되며 정규화와 마찬가지로 일정한 룰이 존재한다. 컬럼을 계산하여 읽을 때 성능이 저하될 것이라 예상 되는 경우 수행한다. 반정규화를 하면 데이터 무결성이 저해 된다. 따라서 무결성을 보장할 수 있는 방법을 고려해야 한다.
<반정규화 대상>
- 자주 사용되는 테이블에 접근하는 프로세스의 수가 많고 항상 일정한 범위만을 조회하는 경우
- 테이블에 대량의 데이터가 있고 대량의 데이터범위를 자주 처리하는 경우, 처리범위를 일정하게 줄이지 않으면 성능을 보장할 수 없을 경우
- 통계성 프로세스에 의해 통계 정보를 필요로 할 때 별도의 통계 테이블을 생성해야 하는 경우
- 조인이 지나지체 많은 경우 BUT!! Sorting 과 Order by 프로세스가 많은 경우와는 무관하다!!
<테이블 반정규화>
- 테이블 병합
JOIN이 필요한 경우가 많아 테이블을 통합하는 것이 성능 측면에서 유리할 경우 고려한다.
① 1:1 관계 테이블 병합 : 1:1 관계에서의 테이블 병합은 비교적 판단하기 수월하며 부작용이 적다
② 1:M 관계 테이블 병합 1:M 관계를 병합 하는 경우 1쪽에 해당하는 엔터티의 속성 개수가 많으면 병합했을 때 중복 데이터가 많아지므로 테이블 병합에 적절하지 못하다.
③ 슈퍼-서브 타입 테이블 병합 : 별도로 관리해야 할 때 분리 해 놓은 테이블을 병합한다 - 테이블 분할
① 테이블 수직 분할 (속성 분할) : 엔터티의 일부 속성을 별도의 엔터티로 분할 1:1 관계 성립 -> 자주 사용하는 속성이 아니거나 대부분의 인스턴스가 해당 속성값을 NULL로 가지고 있을 때 고려
② 테이블 수평 분할 (인스턴스 분할 ,파티셔닝) : 엔터티의 인스턴스를 특정 기준으로 별도의 엔터티로 분할. 파티션 기능을 사용하여 데이터를 물리적으로 분리 - 테이블 추가
① 중복 테이블 추가 : 데이터의 중복을 감안하더라도 성능상 반드시 필요하다고 판단되는 경우 별도의 엔터티를 추가한다.
② 통계 테이블 추가 : 통계치를 미리 계산하여 저장 하는 테이블
③ 이력 테이블 추가
④ 부분 테이블 추가 : 데이터조회가 빈번하게 발생 되는 부분을 따로 테이블로 추가
<컬럼 반정규화>
① 중복 칼럼 추가 : 업무 프로세스상 Join이 필요한 경우가 많아 컬럼을 추가하는 것이 성능 측면에서 유리할 경우 고려
② 파생 컬럼 추가 : 프로세스 수행 시 부하가 염려되는 계산값을 미리 칼럼으로 추가하여 보관하는 방식
③ 이력 테이블 컬럼 추가 : 대량의 이력 테이블을 조회할 때 속도가 느려질 것을 대비하여 조회 기준이 될 것으로 판단되는 컬럼을 미리 추가해 놓는 방식
<관계 반정규화 - 중복 관계추가>
업무 프로세스상 Join이 필요한 경우가 많아 중복 관계를 추가하는 것이 성능 측면에서 유리할 경우 사용한다. 중복 관계 추가는 무결성을 깨뜨릴 위험성 없이 데이터 처리 성능을 향상시킬 수 있는 기법이다.
[트랜잭션]
<트랜잭션이란>
데이터를 조작하기 위한 하나의 논리적인 작업 단위로 하나의 커밋단위로 묶여야한다.
[파티셔닝]
<파티셔닝이란>
하나의 테이블에 많은 양의 데이터가 저장되면 인덱스를 추가하고 테이블을 쪼개도 성능이 저하 되는 경우가 있다. 이때 논리적으로는 하나의 테이블이지만 물리적으로는 여러개의 테이블로 분리하여 액세스 성능도 향상시키고, 데이터 관리방법도 개선 할 수 있도록 적용하는 기법이다
[트리거]
<트리거란>
특정 테이블에 DML 문이 수행되었을 때 자동으로 동작하도록 작성 된 프로그램이다. 테이블, 뷰 뿐만아니라 DB자체에 저장하여 사용 가능하다. Delete on Trigger의 경우 :OLD 는 삭제 전 데이터를, :NEW는 삭제 후 데이터를 나타낸다 .UPDATE TRIGGER 에서 :OLD 에는 수정 전, :NEW 에는 수정 후 값이 들어간다. 또한 Commit, Rollback 이 불가능하다.
[NULL]
< null 이란 >
NULL은 존재하지 않음, 즉 값이 없음(부재)을 의미한다. 0이 아니고 아직 정의 되지 않은 값이다.
NULL을 연산 (+ . - , / , * ) 을 하면 결과도 널이다. 하지만 집계함수 ( select, avg ... ) 에 NULL 값이 있다면 해당 NULL 값을 제외하고 계산이 된다.
- count ( * ) = null 값을 포함한 행의 수를 반환할 것이다.
- count (표현식) = null 값을 제외 한 행의 수를 출력 할 것이다.
- sum ( 표현식 ) = null 값을 제외 한 합계를 출력할 것이다.
[ROWNUM vs TOP]
- ROWNUM( 상위 N 개 추출)
- TOP (Order by 가 있을 시 정렬 후 상위 N개 추출)
ROWNUM이 ORDER BY 와 같은 레벨에 있음 안된다. ROWNUM이 있는데 Order By가 있으면 틀린 SQL문이다. (데이터 읽는 순FROM-WHERE-GROUP BY -HAVING - SELECT -ORDER BY)
[Sort Merge Join]
대용량 데이터를 정렬하여 조인한다. 동등 조인, 비동등 조인에서 모두 사용 가능하다. 각 테이블을 정렬한 후 조인한다.
'SQL' 카테고리의 다른 글
ORA-02449 해결 (0) | 2024.07.30 |
---|---|
[SQLD] 데이터 모델링의 이해 (1) | 2023.09.07 |
ORA-01002: fetch out of sequence 오류 해결 (0) | 2023.08.12 |
ORA-02292 해결 방법 (0) | 2023.07.10 |
[Oracle] 새 접속 만들기 (1) | 2023.05.14 |