(DB실무) Part3-데이터 모델과 성능
2026년 11월 8일 공유
데이터 모델과 성능
콘텐츠 유형: 강의
개요
데이터 모델링 단계에서 성능을 함께 고려하는 성능 데이터 모델링의 목적과 절차를 살펴본다. 핵심은 먼저 정규화를 통해 데이터 이상 현상을 방지하고, 실제 용량과 트랜잭션 패턴을 분석한 뒤 필요한 경우에 한해 반정규화나 인덱스 조정을 적용하는 것이다.
핵심 개념
- 성능 데이터 모델링: 데이터베이스 성능을 고려해 모델을 설계하는 작업. 구현·테스트·운영 단계에서 구조를 되돌려 수정하는 비용을 줄이려면 분석·설계 단계부터 성능을 검토해야 한다.
- 정규화: 함수 종속성에 따라 데이터를 주제별 테이블로 분리해 중복과 삽입·삭제·갱신 이상을 줄이는 과정.
- 반정규화: 정규화를 무시하는 것이 아니라, 정규화 이후 성능 저하가 확인된 부분을 대상으로 조회 성능 향상을 위해 중복·통합·분할 등을 적용하는 방법.
- 관계형 데이터베이스의 제약 조건: 도메인 제약, 키 제약, 개체 무결성 제약, 참조 무결성 제약.
- 인덱스: 검색 속도를 높이는 자료 구조. 검색 성능을 개선하지만 생성·관리에는 시간과 저장 공간이 들기 때문에 필요한 곳에 선별적으로 적용한다.
상세 노트
1. 성능 모델링의 절차
성능을 고려한 모델링은 빠를수록 좋다. 운영 중 성능 문제가 발견되면 재설계와 재구현에 큰 비용이 들 수 있다.
- 정규화를 정확히 수행해 이상 현상을 방지하고 관심사별로 테이블을 분리한다.
- 데이터베이스 용량과 접근량을 산정해 부하가 큰 엔터티를 식별한다.
- 대상 엔터티에서 발생하는 CRUD 트랜잭션 유형과 패턴을 분석한다.
- 용량 및 트랜잭션 특성에 근거해 필요한 반정규화를 검토한다.
- 반정규화로 해결되지 않는 문제는 이력 모델, PK·FK 설정, 슈퍼타입·서브타입 구조 등을 조정하고 최종 성능을 검증한다.
접근이 드문 테이블은 모델 구조를 세밀하게 조정해도 효과가 작을 수 있다. 성능 개선 대상은 실제로 부하가 큰 테이블과 주요 트랜잭션을 중심으로 선정한다.
2. 관계형 데이터베이스와 제약 조건
관계형 데이터베이스의 릴레이션은 테이블이며, 행은 튜플·레코드, 열은 속성·칼럼으로 부른다. 기본 키(PK)는 튜플을 식별하고, 다른 테이블의 PK를 참조하는 값은 외래 키(FK)다.
- 도메인 제약: 속성은 정의된 범위의 값을 가져야 하며, 관계형 테이블의 속성값은 원자적이어야 한다. 복합 속성과 다중값 속성은 테이블 구조에 맞게 분리한다.
- 키 제약: 릴레이션의 튜플은 서로 식별 가능해야 한다. 후보 키 중 대표 키로 선택한 것이 기본 키다.
- 개체 무결성: 기본 키는 유일하고 NULL이 아니어야 한다.
- 참조 무결성: 외래 키는 NULL이거나 참조 대상 테이블에 실제로 존재하는 값을 가져야 한다. 존재하지 않는 값을 참조하거나, 참조되는 행을 무조건 삭제하면 무결성이 깨질 수 있다.
일부 설명에서는 키 제약과 개체 무결성을 합쳐 ‘개체 무결성’으로 다루기도 하므로 문맥에 따라 구분한다.
3. 정규화와 이상 현상
여러 주제의 정보를 한 테이블에 섞어 두면 다음과 같은 이상 현상이 발생할 수 있다.
- 삭제 이상: 한 정보를 삭제했는데 함께 저장된 다른 정보까지 사라진다.
- 삽입 이상: 특정 정보를 입력하려면 아직 존재하지 않는 다른 정보도 필요해 입력이 막힌다.
- 갱신 이상: 같은 정보가 여러 행에 중복되어 있어 일부만 변경되면 데이터가 불일치한다.
정규화는 테이블을 학생·과목·수강처럼 주제별로 나누어 이상 현상을 줄인다.
- 제1정규형(1NF): 모든 속성값이 원자값이다.
- 제2정규형(2NF): 제1정규형을 만족하고, 복합 키의 일부에만 종속되는 부분 함수 종속을 제거한다.
- 제3정규형(3NF): 제2정규형을 만족하고, 일반 속성이 다른 일반 속성을 결정하는 이행 함수 종속을 제거한다.
실무에서는 일반적으로 제3정규형을 목표로 삼는다. 함수 종속성에서 결정자는 다른 속성을 결정하는 속성 또는 속성 집합이며, 정규화는 키 전체에 종속되는 속성 중심으로 테이블을 구성하는 과정이다.
4. 정규화가 성능에 미치는 영향
정규화는 항상 성능을 낮추는 것이 아니다.
- 관심사별로 데이터가 분리되고 중복이 줄어들어, 필요한 정보를 찾거나 갱신할 때 처리량이 감소할 수 있다.
- 특히 삽입·삭제·갱신은 중복 데이터의 관리 부담이 줄어 성능과 일관성이 개선될 수 있다.
- 반면 조회 시 여러 테이블을 조인해야 할 수 있다. 따라서 조회 성능은 쿼리의 조건과 접근 패턴에 따라 향상되거나 저하될 수 있다.
예를 들어 학생 정보가 대규모 수강 테이블에 중복 저장되어 있다면, 학생 정보만 조회할 때 불필요하게 많은 행을 살펴봐야 한다. 학생 정보를 별도 테이블로 분리하면 이러한 조회는 효율적일 수 있지만, 학생·수강·과목 정보를 함께 조회할 때는 조인이 필요하다.
5. 반정규화
반정규화는 정규화를 수행한 뒤, 조회 성능 문제를 해결하기 위해 데이터 모델의 일부를 의도적으로 변경하는 작업이다. 중복을 만들 수 있어 데이터 무결성 관리가 중요하므로, 먼저 인덱스 조정·뷰·클러스터링·프로그램 처리 로직 개선 등 다른 방법을 검토한다.
칼럼 반정규화
- 중복 칼럼 추가: 자주 함께 조회되는 다른 테이블의 속성을 복사해 조인을 줄인다.
- 파생 칼럼 추가: 계산 비용이 큰 합계 등 예상 가능한 값을 미리 저장한다. 값이 바뀔 때 함께 갱신해야 한다.
- 이력 테이블 칼럼 추가: 이력 중 최신 데이터인지 여부를 표시하는 칼럼을 두어 최신 행을 빠르게 찾는다.
- PK의 의미를 분리하는 칼럼 추가: PK에 포함된 정보를 별도 속성으로 저장해 해당 조건의 검색을 빠르게 한다.
- 데이터 복구용 칼럼 추가: 현재 값과 직전 값을 함께 보관해 오류나 실수 발생 시 복구를 돕는다.
테이블 반정규화
- 테이블 병합: 함께 조회되는 테이블을 합쳐 조인을 줄인다. 일반 관계의 병합이나 슈퍼타입·서브타입 통합이 여기에 해당한다.
- 테이블 분할: 접근 패턴에 따라 칼럼을 나누는 수직 분할, 행을 나누는 수평 분할을 적용한다. 이는 정규형 수준 자체를 낮추는 것과는 다를 수 있지만, 성능을 위해 구조를 변경하는 반정규화 기법으로 설명되기도 한다.
- 테이블 추가: 중복 테이블, 통계 테이블, 이력 테이블, 부분 테이블 등을 추가해 자주 수행되는 조회를 지원한다. 부분 테이블 추가는 원본을 유지하면서 일부 칼럼을 별도 테이블에 복제하는 방식이며, 원본에서 칼럼을 떼어내는 수직 분할과 다르다.
슈퍼타입·서브타입 구조는 접근 패턴에 따라 선택한다.
- 원투원 타입: 공통 정보와 서브타입 정보를 별도 테이블로 유지한다. 각 테이블에 개별 접근하는 경우에 적합하다.
- 플러스 타입: 슈퍼타입과 서브타입을 종류별로 통합한다. 공통 정보와 특정 서브타입 정보를 함께 조회하는 경우를 고려한다.
- 싱글 타입: 모든 유형을 하나의 테이블로 합친다. 여러 서브타입을 함께 조회할 때 조인을 줄일 수 있지만, 테이블이 커지고 확장성이 낮아질 수 있다.
관계 반정규화
테이블 수는 그대로 두고 관계를 추가해 조인 경로를 단축한다. 기존 경로로 조회할 수 있더라도 조인이 지나치게 길고 해당 조회가 빈번한 경우에 검토한다.
6. 테이블 분할과 파티션
테이블 용량이 크고 트랜잭션이 특정 행 또는 열에 집중되는 패턴이 확인되면 분할을 검토한다. 분할 방식은 실제 데이터량과 트랜잭션 접근 패턴을 기준으로 정한다.
- 레인지 파티션: 연속적인 범위로 분할한다.
- 리스트 파티션: 지역명처럼 지정된 값에 따라 분할한다.
- 해시 파티션: 해시 함수를 적용한 결과로 분할한다.
7. 인덱스와 키 순서
테이블은 저장 순서가 정렬되어 있다고 보장되지 않으므로, 조건에 맞는 행을 찾으려면 전체 테이블을 읽는 풀 스캔이 발생할 수 있다. 인덱스는 검색에 자주 사용되는 속성을 별도로 정렬해 저장하고, 해당 행의 위치를 찾도록 돕는다.
- PK나 유일성 제약을 가진 칼럼에는 인덱스가 자동 생성될 수 있다.
- FK를 포함해 조회 조건으로 자주 사용되는 칼럼은 추가 인덱스 후보가 될 수 있다.
- 인덱스는 공간을 차지하고 데이터 변경 시 유지 관리 비용이 발생하므로 무조건 많이 만들지 않는다.
- 복합 PK의 칼럼 순서는 인덱스 정렬과 검색 효율에 영향을 준다. 자주 검색 조건으로 쓰이는 칼럼을 앞쪽에 배치하면 해당 검색에서 인덱스를 효율적으로 사용할 수 있다. 뒤쪽 칼럼만 조건으로 검색하면 인덱스 전체를 확인해야 할 수 있다.
성능 개선의 기본 원칙은 정규화로 이상 현상을 방지한 뒤, 실제 용량과 트랜잭션 패턴을 근거로 필요한 곳에만 반정규화와 인덱스 조정을 적용하는 것이다.