[SQLD] 1-5. 대량 데이터에 따른 성능
2021. 10. 27. 16:32ㆍCertificate`/SQLD
대량 데이터에 따른 테이블 분할
- 아무리 설계가 잘 된 데이터 모델이어도 대량 데이터가 하나의 테이블에 집약되어 있으면 성능이 저하된다
≫ 트랜잭션이 분산될 수 있도록 테이블 단위에서 분할 적용
1. 하나의 테이블에 여러 컬럼 존재 (1:1 관계 분할)
- 데이터가 디스크 여러 블록에 존재하면 디스크에서 데이터를 읽는 I/O량이 증가하여 성능이 저하
- 많은 컬럼 ≫ 로우체이닝, 로우 마이그레이션 또한 많아짐
2. 하나의 테이블에 대량의 데이터 존재 (파티셔닝)
- 인덱스 Tree 구조가 너무 커져서 효율성이 낮아지고 데이터 처리(DML)를 할 때 디스크 I/O를 많이 유발
- 인덱스 Tree 구조가 커지면 인덱스를 찾아가는 단계가 깊어져서 조회의 성능에 영향을 미침
※ 로우 체이닝(Row Chaining) / 로우 마이그레이션(Row Migration)
- 로우 체이닝
- 로우 길이가 너무 길어서 데이터 블록 하나에 모두 저장되지 않고 2개 이상의 블록에 걸쳐서 저장
- 로우 마이그레이션
- 데이터 블록에서 수정이 발생하면 수정된 데이터를 해당 데이터 블록에 저장하지 못하고 다른 블록의 빈 공간을 찾아서 저장
하나의 테이블에 여러 칼럼 존재 (1:1 관계 분할)
- 분리된 테이블은 디스크에 적어진 칼럼이 저장되어서 로우 체이닝, 로우 마이그레이션이 많이 줄어든다
- 트랜잭션을 분석해서 적절하게 1:1 관계로 분리함으로써 성능 향상
하나의 테이블에 대량의 데이터 존재 (파티셔닝)
● Range Partition (범위)
- 대상 테이블을 날짜/숫자 값으로 분리가 가능 + 영역별로 트랜잭션이 분리 → Range Partition 적용
- 데이터 보관 주기에 따라 테이블에 데이터를 쉽게 지우는 것이 가능 (파티션 테이블 DROP)
- 데이터 보관 주기에 따른 테이블 관리가 용이하다
● List Partition (특정값 지정)
- 대용량 데이터를 특정값(지점, 도시, 핵심코드,...)에 따라 분리 저장
- 데이터보관주기에 따라 쉽게 삭제하는 기능 X
● Hash Partition (해쉬 적용)
- 지정된 Hash 조건에 따라 Hash Algorithm이 적용되어서 테이블 분리
- 설계자는 테이블에 데이터가 정확히 들어갔는지 모른다 / 성능 향상을 위해 사용
- 데이터보관주기에 따라 쉽게 삭제하는 기능 X
테이블에 따른 수평/수직 분할 절차
1. 데이터 모델 완성
2. DB 용량 산정 수행
3. 대량 데이터가 처리되는 테이블에 대해 트랜잭션 처리 패턴 분석
4. 컬럼 단위로 집중화된 처리가 발생 or 로우 단위로 집중화된 처리가 발생했는지 분석해서 집중화된 단위로 테이블 분리 검토