본문 바로가기

SQLD/SQL 전문가 가이드

1.2.4 제4절 대량 데이터에 따른 성능

1. 대량 데이터발생에 따른 테이블 분할 개요

  • 아무리 설계가 잘되어 있는 데이터 모델이라도 대량의 데이터가 하나의 테이블에 집약되어 있고 하나의 하드웨어 공간에 저장되어 있으면 성능저하를 피하기가 힘들다.
  • 트랜잭션이 분산 처리 될 수 있도록 테이블단위에서 분할 필요

  • 한 테이블에 데이터가 대량으로 집중되거나 하나의 테이블에 여러 개의 칼럼이 존재하여 디스크에 많은 블록을 점유하는 경우는 모두 성능저하를 유발할 수 있는 경우
    • 대량의 데이터 시, 인덱스 Tree구조가 너무  커져 효율성이 떨어져 데이터를 처리 할 때 디스크 I/O를 많이 유발
      • SQL에서 처리하는 I/O량이 증가 -> 적절한 인덱스 구성으로 해소 가능할 것으로 예상되지만, 정말 대량의 데이터 일때에는 인덱스 Tree구조가 커짐에 따라 CUD 수행 시 성능 저하를 유발
    • 많은 수의 컬럼 시, 데이터가 디스크의 여러 블록에 존재하므로인해 디스크에서 데이터를 읽는 I/O량이 많아지게 되어 성능이 저하
      • 로우체이닝과 로우마이그레이션이 발생함
      • 로우체이닝 : 로우 길이가 길어 데이터를 하나의 블록에 저장되지 못하고 두 개 이상의 블록에 걸쳐 하나의 로우가 저장되어 있는 형태
      • 로우마이그레이션 : 데이터 블록에서 수정이 발생하면 수정된 데이터를 해당 데이터 블록에서 저장하지 못하고 다른 블록의 빈 공간을 찾아 저장하는 방식

 

2. 한 테이블에 많은 수의 칼럼을 가지고 있는 경우

  • 앞에 위치하는 발행기간명과 수량 공고일, 발행일을 조회 할 경우 물리적으로 컬럼의 값이 블록에 넓게 산재되어 있어 디스크 I/O가 많이 발생하게 됨

 

  • 기존의 도서정보 테이블에서 전자출판유형과 도서대체 영역을 확인하여 도서정보와 트랜잭션이 독립적으로 발생이 되는 경우가 많음을 확인하여 1:1 관계로 분리

  • 1:1 관계로 분리함에 따라, 디스크에 적은 블록에 담기게 됨으로 로우마이그레이션과 로우체이닝 현상이 줄어듬

 

3. 대량 데이터 저장 및 처리로 인해 성능

  • 많은 양의 데이터가 예상될 경우 파티셔닝을 적용하거나 PK에 의해 테이블을 분할하는 방법을 적용
    • Partition Table
      • List Partition(특정값 지정)
      • Range Partition(범위-날짜)
      • Hash Partition(해쉬)
      • Composite Partition(복합-Range+Hash)

 

4. 테이블에 대한 수평분할/수직분할 절차

절차

  1. 데이터 모델링을 완성한다.
  2. 데이터베이스 용량산정을 한다.
  3. 대량 데이터가 처리되는 테이블에 대해서 트랜잭션 처리 패턴을 분석
  4. 컬럼 단위로 집중화된 처리가 발생하는지, 로우단위로 집중화된 처리가 발생되는지 분석하여 집중화된 단위로 테이블을 분리하는 것을 검토
  • 용량산정은 어느 테이블에 데이터의 양이 대용량이 되는지 분석하는 것
  • 특정 테이블의 용량이 대용량인 경우 컬럼의 수가 너무 많은 지 확인하고, 많을 경우 트랜잭션의 특성에 따라 테이블을 1:1 형태로 분리할 수 있는지 검증하며, 컬럼수가 적은 경우 파티셔닝 전략을 고려

 

 

 

 

 

반응형