2장. 데이터 모델과 성능
3. 반정규화와 성능
- 반정규화
- 정의: 정규화된 엔티티, 속성, 관계에 대해 시스템의 성능 향상과 개발, 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링 기법
- 수행 예시:
1. 데이터를 조회할 때 디스크 I/O양이 많아서 성능이 저하될 때
- 경로가 너무 멀어 조인으로 인한 성능 저하가 예상될 때
- 컬럼을 계산하여 읽을 때 성능이 저하될 것이 예상될 때
- 데이터 무결성이 침해될 가능성이 높음 -> 성능상의 이점을 위해 포기
- 적용 방법
- 반정규화 적용 절차
1. 반정규화 대상 조사
- 다른 방법유도 검토
- 반정규화 적용
- 반정규화 대상 조사
1. 자주 사용되는 테이블에 접근하는 프로세스의 수가 많고 항상 일정한 범위만을 조회하는 경우
- 테이블에 대량의 데이터가 있고, 대량의 데이터 범위를 자주 처리하는데 처리 범위를 일정하게 줄이지 않으면 성능을 보장할 수 없을 경우
- 통계성 프로세스에 의해 통계 정보를 필요로 할 때, 별도의 통계테이블(반정규화 테이블)을 생성
- 테이블에 지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우
- 다른 방법 검토
1. 지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우: 뷰(View)를 사용
- 대량의 데이터처리나 부분처리에 의해 성능이 저하되는 경우: 클러스터링을 적용 or 인덱스를 조정
- 대량의 데이터는 PK성격에 따라 부분적인 테이블로 분리 가능: 파티셔닝 기법 적용
- 응용 애플리케이션에서 로직을 구사하는 방법을 변경함으로써 성능 향상 가능: 응용 메모리 영역에 데이터 처리를 위한 값을 캐쉬하거나, 중간 클래스 영역에 데이터를 캐쉬하여 공유
- 반정규화 적용
1. 테이블 반정규화, 속성의 반정규화, 관계의 반정규화 수행
- 반정규화 기법
4. 대량 데이터에 따른 성능
- 대량 데이터 발생에 따른 테이블 분할
- 데이터가 특정 테이블에 몰리지 않도록 테이블 단위의 분할 시도
- 로우 체이닝(Row Chaining): 로우 길이가 너무 길어서 데이터 블록 하나에 데이터가 모두 저장되지 않고, 두 개 이상의 블록에 걸쳐 하나의 로우가 저장되어 있는 형태
- 로우 마이그레이션(Row Migration): 데이터 블록에서 수정이 발생하면 수정된 데이터를 해당 데이터 블록에서 저장하지 못하고 다른 블록의 빈 공간을 찾아 저장하는 방식
- 트랜잭션을 분석하여 적절하게 1:1 관계로 분리하여 성능 향상이 가능하도록 해야 함
- 대량 데이터 저장 및 처리
- 논리적으로는 하나의 테이블로 보이지만, 물리적으로 여러 개의 테이블스페이스에 쪼개어 저장될 수 있는 구조의 파티셔닝을 적용하거나, PK로 테이블을 분할하는 방법을 적용
- Range Partition
1. 대상 테이블이 날짜 또는 숫자값으로 분리가 가능하고, 각 영역별로 트래잭션이 분리되어 있는 경우
- 예: 요금 테이블 -> 요금_0901, 요금_0902
- List Partition
1. 지점, 사업소, 사업장, 코드값 등으로 PK가 구성되어 있는 경우, 값 각각에 의해 파티셔닝
- 예: 회원 테이블 -> 회원서울, 회원제주
- Hash Partition
1. 지정된 Hash 조건에 따라 hash 알고리즘이 적용되어 테이블 분리
- 테이블 수평/수직 분할 절차
- 데이터 모델링 완성
- 데이터베이스 용량 산정
- 대량 데이터가 처리되는 테이블에 대해서 트랜잭션 처리 패턴을 분석
- 칼럼/로우 단위로 집중화된 처리가 발생하는지 분석하여 집중화된 단위로 테이블을 분리하는 것을 검토
참고:
https://yganalyst.github.io/sql/SQL_5/#google_vignette
https://fromitot.tistory.com/86