[SQLD] 2_데이터 모델과 성능(2)

잠이보약·2023년 9월 2일

자격증

목록 보기
5/7

2장. 데이터 모델과 성능

3. 반정규화와 성능

  1. 반정규화
    • 정의: 정규화된 엔티티, 속성, 관계에 대해 시스템의 성능 향상과 개발, 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링 기법
    • 수행 예시:
      1. 데이터를 조회할 때 디스크 I/O양이 많아서 성능이 저하될 때
      1. 경로가 너무 멀어 조인으로 인한 성능 저하가 예상될 때
      2. 컬럼을 계산하여 읽을 때 성능이 저하될 것이 예상될 때
    • 데이터 무결성이 침해될 가능성이 높음 -> 성능상의 이점을 위해 포기
  2. 적용 방법
    • 반정규화 적용 절차
      1. 반정규화 대상 조사
      1. 다른 방법유도 검토
      2. 반정규화 적용
    • 반정규화 대상 조사
      1. 자주 사용되는 테이블에 접근하는 프로세스의 수가 많고 항상 일정한 범위만을 조회하는 경우
      1. 테이블에 대량의 데이터가 있고, 대량의 데이터 범위를 자주 처리하는데 처리 범위를 일정하게 줄이지 않으면 성능을 보장할 수 없을 경우
      2. 통계성 프로세스에 의해 통계 정보를 필요로 할 때, 별도의 통계테이블(반정규화 테이블)을 생성
      3. 테이블에 지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우
    • 다른 방법 검토
      1. 지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려울 경우: 뷰(View)를 사용
      1. 대량의 데이터처리나 부분처리에 의해 성능이 저하되는 경우: 클러스터링을 적용 or 인덱스를 조정
      2. 대량의 데이터는 PK성격에 따라 부분적인 테이블로 분리 가능: 파티셔닝 기법 적용
      3. 응용 애플리케이션에서 로직을 구사하는 방법을 변경함으로써 성능 향상 가능: 응용 메모리 영역에 데이터 처리를 위한 값을 캐쉬하거나, 중간 클래스 영역에 데이터를 캐쉬하여 공유
    • 반정규화 적용
      1. 테이블 반정규화, 속성의 반정규화, 관계의 반정규화 수행
  3. 반정규화 기법
    • 테이블 반정규화
    • 칼럼 반정규화
    • 관계 반정규화

4. 대량 데이터에 따른 성능

  1. 대량 데이터 발생에 따른 테이블 분할
    • 데이터가 특정 테이블에 몰리지 않도록 테이블 단위의 분할 시도
    • 로우 체이닝(Row Chaining): 로우 길이가 너무 길어서 데이터 블록 하나에 데이터가 모두 저장되지 않고, 두 개 이상의 블록에 걸쳐 하나의 로우가 저장되어 있는 형태
    • 로우 마이그레이션(Row Migration): 데이터 블록에서 수정이 발생하면 수정된 데이터를 해당 데이터 블록에서 저장하지 못하고 다른 블록의 빈 공간을 찾아 저장하는 방식
    • 트랜잭션을 분석하여 적절하게 1:1 관계로 분리하여 성능 향상이 가능하도록 해야 함
  2. 대량 데이터 저장 및 처리
    • 논리적으로는 하나의 테이블로 보이지만, 물리적으로 여러 개의 테이블스페이스에 쪼개어 저장될 수 있는 구조의 파티셔닝을 적용하거나, PK로 테이블을 분할하는 방법을 적용
    • Range Partition
      1. 대상 테이블이 날짜 또는 숫자값으로 분리가 가능하고, 각 영역별로 트래잭션이 분리되어 있는 경우
      1. 예: 요금 테이블 -> 요금_0901, 요금_0902
    • List Partition
      1. 지점, 사업소, 사업장, 코드값 등으로 PK가 구성되어 있는 경우, 값 각각에 의해 파티셔닝
      1. 예: 회원 테이블 -> 회원서울, 회원제주
    • Hash Partition
      1. 지정된 Hash 조건에 따라 hash 알고리즘이 적용되어 테이블 분리
  3. 테이블 수평/수직 분할 절차
    • 데이터 모델링 완성
    • 데이터베이스 용량 산정
    • 대량 데이터가 처리되는 테이블에 대해서 트랜잭션 처리 패턴을 분석
    • 칼럼/로우 단위로 집중화된 처리가 발생하는지 분석하여 집중화된 단위로 테이블을 분리하는 것을 검토

참고:
https://yganalyst.github.io/sql/SQL_5/#google_vignette
https://fromitot.tistory.com/86

profile
백엔드 개발자 지망생

0개의 댓글