1. 성능 데이터 모델링의 개요

1) 성능 데이터 모델링의 정의

데이터의 용량이 커질수록, 기업의 의사결정 속도가 빨라질수록 데이터를 처리하는 속도는 빠르게 처리되어야 할 필요성을 반증해준다. 성능이 저하되는 데이터 모델의 경우 크게 세 가지를 고려하여 그 성능을 향상시킬 수 있다.

  • 데이터 모델 구조에 의한 성능 저하
  • 데이터의 대용량화로 인한 불가피한 성능 저하
  • 인덱스 특성을 고려하지 않은 생성으로 인한 성능 저하

데이터 모델링을 할 때, 어떤 작업 유형에 따라 성능 향상을 도모해야 하는지 목표를 분명하게 해야 정확한 성능 향상 모델링을 할 수 있다. 데이터 입력/수정/삭제는 일시적이고 빈번하지 않으며 단건 처리가 많은 반면, 데이터 조회의 경우 반복적이고 빈번하며 여러 건을 처리 하는 경우가 많기 때문에 업무에 따라 중요도가 달라진다.

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

sqld-1-2-1

성능 데이터 모델링은 단순히 반정규화만을 의미하지 않고, 정규화를 통해서도 수행할 수 있으며, 인덱스의 특징을 고려하여 컬럼의 순서도 변형할 수 있다. 또한 대량의 데이터 특성에 따라 정규화 된 모델이라도 테이블을 수직 또는 수평분할하여 적용하거나, 논리적인 테이블을 물리적인 테이블로 전환할 때 데이터 처리 성격에 따라 변환하는 방법도 성능 데이터 모델링의 범주에 포함될 수 있다.

2) 성능 데이터 모델링 수행시점

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

sqld-1-2-2

따라서 분석/설계 단계에서 데이터베이스 처리 성능을 향상시킬 수 있는 방법을 주도면밀하게 고려해야 한다. 만약 어떤 트랜잭션이 해당 비즈니스 처리에 핵심적이고, 사용자 업무 처리에 있어 중요하다면 프로젝트 초기에 운영 환경에 대비한 테스트 환경을 구현하고, 그 곳에 트랜잭션을 발생시켜 실제 성능을 테스트해 보아야 한다. 이 때 데이터 모델의 구조도 변경하면서 어떠한 구조가 해당 사이트에 가장 적절한 구조인지 검토하여 디자인하는 전략이 요구된다.

3) 성능 데이터 모델링 고려사항

  • 데이터 모델링을 할 때 정규화를 정확하게 수행한다.
    – 정규화 된 모델은 데이터를 주요 관심사 별로 분산하여 성능을 향상시킨다.

  • 데이터베이스 용량 산정을 수행한다.
    – 어떤 엔터티에 데이터가 집중되는지 파악하여 성능 고려 적용의 기준이 된다.

  • 데이터베이스에 발생되는 트랜잭션의 유형을 파악한다.
    – SQL 문장의 조인 관계 테이블에서 데이터 조회 컬럼들을 파악하고, 그에 따른 데이터 모델을 설계할 수 있다.

  • 용량과 트랜잭션의 유형에 따라 반정규화를 수행한다.
    – 반정규화는 테이블, 속성, 관계에 대해 포괄적으로 적용해야 한다.

  • 이력 모델의 조장, PK/FK 조정, 슈퍼타입/서브타입 조정 등을 수행한다.
    – PK/FK 순서가 인덱스 특성에 따라 성능에 미치는 영향도가 크기 때문에 반드시 PK/FK 를 성능이 우수한 순서대로 컬럼 순서를 조정해야 한다.

  • 성능 관점에서 데이터 모델을 검증한다.
    – 일반적인 데이터 모델 규칙 뿐만 아니라 충분하게 성능이 고려되었는지 검증하도록 한다.

2. 정규화와 성능

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

데이터베이스에서 데이터를 처리할 때 성능이라고 하면 ①조회 성능, ②입력/수정/삭제 성능 두 가지로 구분된다. 데이터 모델을 구성하는 방식에 따라 두 성능이 Trade-Off 되어 나타나는 경우가 많다.
정규화를 수행한다는 것은 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반 속성을 의존자로 하여 입력/수정/삭제 이상을 제거하는 것이다. 데이터의 중복 속성을 제거하고, 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다. 따라서 정규화 된 테이블은 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있는 특성이 있다.

sqld-1-2-3

[그림 I-2-3] 에서 정규화 수행 모델은 데이터를 입력/수정/삭제 할 때 일반적으로 반정규화 된 테이블에 비해 처리 성능이 향상되지만, 데이터 조회를 할 때는 처리 조건에 따라 달라지는 것을 볼 수 있다.
따라서 일반적으로 정규화가 잘 되어있으면 입력/수정/삭제의 성능이 향상되고, 반정규화를 많이 하면 조회 성능이 향상된다고 인식할 수 있다. 그러나 반정규화만이 조회 성능을 향상시킨다는 고정관념은 탈피해야 한다. 정규화를 해야만 성능이 향상되는 경우도 나타나기 때문이다.

2) 함수적 종속성 (Functional Dependency) 에 근거한 정규화 수행 필요

함수의 종속성 (Functional Dependency) 은 데이터들이 어떤 기준값에 의해 종속되는 현상을 말한다. 이 때 기준값을 결정자 (Determinant), 종속되는 값을 종속자 (Dependent) 라고 한다.

sqld-1-2-11

함수의 종속성은 데이터가 가지고 있는 근본적인 속성으로 인식되고 있다. 정규화의 궁극적인 목적은 반복적인 데이터를 분리하고, 각 데이터가 종속된 테이블에 정합성에 따라 배치되도록 하는 것이므로, 함수의 종속성을 이용하여 정규화 작업이나 각 오브젝트 속성을 배치하는 작업에 이용된다. 프로젝트 수행에서 정규화는 선택이 아닌 필수사항이다.

3. 반정규화와 성능

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

(1) 반정규화의 정의

반정규화(=역정규화)는 정규화 된 엔터티, 속성, 관계에 대해 시스템 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링 기법을 의미한다. 데이터 무결성이 깨질 수 있는 위험을 감수하고 반정규화를 적용하는 이유는 데이터를 조회할 때 디스크 I/O 량이 많아서 성능이 저하되거나, 경로가 너무 멀어 조인으로 인한 성능 저하가 예상되거나, 컬럼을 계산하여 읽음으로써 성능 저하가 예상되는 경우에 수행하게 된다.

sqld-1-2-12

정규화는 성능을 향상시키는 역할을 하지만, 정규화만을 수행하면 엔터티의 갯수가 증가하고 관계가 많아져 일부 여러 개의 조인이 걸려야만 데이터를 조회할 수 있게 되는 경우가 있다. 이러한 경우 업무적으로 조회 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 되는 것이다. 또한 정규화의 함수적 종속관계는 위반하지 않지만, 데이터의 중복성을 증가시켜야만 조회 성능이 향상되는 경우 반정규화를 수행 할 수 있다.

반정규화를 기술적으로 수행하지 않는 경우 다음과 같은 현상이 발생한다.

  • 성능이 저하된 데이터베이스가 생성될 수 있다.
  • 구축, 시험 단계에서 반정규화를 적용할 때 수정에 따른 노력 비용이 많이 들게 된다.

(2) 반정규화의 적용방법

반정규화는 일반적으로 SQL문장을 단순하게 처리하기 위한 컬럼의 반정규화 유형이 많이 나타나는데, 이것은 데이터에 대한 무결성을 깨뜨리는 결정적인 역할을 하게 된다. 따라서 막연하게 반정규화를 통해 컬럼 중복을 유도하기 보다는 성능을 향상시킬 수 있는 다른 방법을 고려한 후 반정규화를 적용해야 한다.
또한 반정규화를 적용할 때는 반드시 데이터 무결성을 보장할 수 있는 방법을 고려해야 한다. 정규화와 반정규화 사이에는 Trade-Off 관계가 존재하기 때문에 반정규화를 적용할 때에는 데이터 무결성이 충분히 유지될 수 있도록 프로세스 처리의 안정성이 먼저 확인되어야 한다.

반정규화를 적용하기 위해서는 [그림 I-2-13] 처럼 반정규화의 대상을 조사하고, 다른 방법을 검토한 후 적용하도록 한다.

sqld-1-2-13

2) 반정규화의 기법

(1) 테이블의 반정규화

sqld-i-2-1

(2) 컬럼의 반정규화

sqld-i-2-2

(3) 관계 반정규화

sqld-i-2-3