2.2 관계와 조인의 이해
조인(JOIN) : 두 개의 테이블을 공통의 식별자를 통해 하나의 테이블로 합치는 것. 보통 O(N^2)의 매우 높은 부하를 유발한다.
정규화를 통해 분해된 테이블들은 조회 과정에서 여러 번의 조인이 발생할 수 있다. 따라서 정규화 수준이 높을수록 전체적으로 조회 성능이 떨어진다. 이러한 성능 저하를 막기 위해서 적절한 수준에서 정합성 수준을 결정해야 한다.
반정규화(De-Normalization) : 정규화와는 반대로 데이터의 중복을 허용하거나 데이터를 그룹핑하여 조회성능을 높이는 것. 반정규화는 또 다른 문제를 발생시킬 수 있으므로 반정규화 이전에 다른 대안을 먼저 검토해야 한다.
① 테이블 병합
조인의 발생 빈도가 높아서 아예 여러 테이블을 하나로 합치는 것이 성능 향상에 효율적이라면 테이블을 병합한다
② 테이블 분할
테이블의 특정 속성들에 대해서만 집중적으로 접근하는 경우 별도의 테이블로 분할한다. 접근 빈도가 잠김 또는 경합 현상이 감소하는 효과가 있으나 분할된 테이블의 속성을 한 번에 조회할 때에는 결국 유니온이나 조인을 사용해야 하므로 성능 하락이 발생할 수 있다.
– 수직분할 : 특정 속성들에 대해서만 접근이 빈번할 때 해당 속성들을 별도의 테이블로 분할하여 1:1 관계로 만드는 방법.
– 수평분할 : 속성의 값에 따라서 구분하여 조회하는 경우 인스턴스를 그룹핑하여 나눌 수 있도록 분할하는 방법.
③ 테이블 추가
조회에 필요한 속성을 포함하는 새로운 테이블을 추가한다. 중복, 통계, 이력, 부분 테이블 추가 방법이 있다.
– 중복 테이블 추가 : 다른 업무나 서버에 있는 테이블과 동일한 구조의 테이블을 중복해서 추가하는 방법.
– 통계 테이블 추가 : SUM, AVG 등 통계값에 해당하는 연산을 미리 계산하여 저장하는 별도의 테이블을 추가하는 방법.
– 이력 테이블 추가 : 변경 이력 등 이력 데이터를 관리할 수 있는 테이블을 별도로 추가하는 방법.
– 부분 테이블 추가 : 디스크 I/O를 줄이기 위해 하나의 테이블 내에 특별히 자주 사용하는 속성들만 별도로 모아서 새로운 테이블로 추가하는 방법.
① 중복 칼럼 추가 : 조인을 감소시키기 위해 자주 사용하는 칼럼을 중복 추가하는 기법.
② 파생 칼럼 추가 : 트랜잭션 처리 시 계산에 의한 부하 발생을 줄이기 위해 계산값을 별도의 칼럼으로 미리 추가하는 기법.
③ 이력 테이블 칼럼 추가 : 대량의 데이터를 처리할 때 조회성능 저하를 예방하기 위해 이력 테이블에 조회 조건에 해당하는 기능성 칼럼을 추가하는 기법.
④ PK에 의한 칼럼 추가 : 복합 의미를 갖는 PK를 단일 속성으로 구성했을 때, PK를 파싱(텍스트 분해)해서 추가적인 내용을 조회해야 하는 경우에 성능 하락이 있을 수 있으므로 이를 일반 속성으로 추가하는 기법.
⑤ 응용 시스템 오동작을 위한 칼럼 추가 : 응용 시스템에서 데이터 처리 도중 오류가 발생한 경우에 복원을 위해 이전 데이터를 임시로 중복하여 보관하는 기법.
관계 반정규화 : 여러 관계를 거쳐 다수의 조인을 통해 처리가 가능하지만, 이때 발생할 수 있는 성능 저하를 막기 위해 추가적으로 중복된 관계를 맺는 방법.