Ga0's
SQLD_대량 데이터에 따른 성능 본문
대량 데이터에 따른 성능
1. 대량 데이터 발생에 따른 테이블 분할
▪ 대량의 데이터가 하나의 테이블과 하나의 하드웨어 공간에 집약/저장 되어 있으면, 성능 저하를 피할 수 X.
▪ 처리 하는 일의 양이 한군데에 몰리는 현상 → 중요한 업무에 해당하는 데이터가 특정 테이블에 있는 경우!
→ 이러한 경우, 트랜잭션이 분산 처리될 수 있도록 테이블단위에서 분할의 방법을 적용할 필요!
▪ 수직 분할 : 컬럼 단위로 분할하여 I/O 경감
▪ 수평 분할 : 로우 단위로 분할하여 I/O 경감
2. 성능 저하의 원인
▪ 하나의 테이블에 데이터 대량 집중 : 테이블의 구조가 너무 큼 → 효율성 감소 → 데이터 처리(입력, 수정, 삭제, 조회)시 디스크 I/O 많이 유발, 인덱스(테이블에서 데이터를 찾는 용도)를 생성할 때 인덱스의 크기가 커짐(인덱스를 찾아가는 단계가 깊어짐) → 조회 성능에 영향을 끼침(조회 성능에는 영향을 미치는 정도가 작지만 데이터 입력/수정/삭제 하는 트랜잭션의 경우 인덱스의 특성상 일량이 증가하여 성능저하를 유발)
▪ 하나의 테이블에 여러개의 칼럼이 존재 : 데이터가 여러 블록에 존재(디스크 점유량이 증가) → 디스크에서 데이터를 읽는 I/O량이 증가 → 성능 저하
▪ 대량의 데이터가 처리되는 테이블 : SQL 문장에서 데이터 처리 위한 I/O량 증가
▪ 대량의 데이터가 하나의 테이블에 존재 : 인덱스의 크기 증가 → 성능 저하
▪ 칼럼이 많아지는 경우 : 로우 체이닝, 로우 마이그레이션 발생
+
▪ 로우 체이닝(Row Chaining) : 로우 길이가 너무 길어서 데이터 블록 하나에 데이터가 모두 저장되지 않고 두개 이상의 블록에 걸쳐 하나의 로우가 저장되어 있는 형태
▪ 로우 마이그레이션(Row Migration) : 데이터 블록에서 수정이 발생하면 해당 데이터 블록에서 저장하지 못하고 다른 블록의 빈 공간을 찾아 저장하는 방식
→ 로우 길이가 너무 긴 경우 로우 체이닝과 로우 마이그레이션이 발생하여 많은 블록에 데이터가 저장 → 데이터 베이스 메모리에서 디스크와 I/O(입력/출력)가 발생할 때 불피료하게 I/O가 발생하여 성능 저하
3. 해결 방안
▪ 한 테이블에 많은 컬럼 : 어떤 칼럼에 대해 집중적으로 발생하는지 분석 → 테이블 쪼갬 → 디스크 I/O → 성능 개선
▪ 대량 데이터 저장 및 처리
▫ 파티셔닝 (Partitioning)
- Range Partition : 대상 테이블이 날짜 또는 숫자값으로 분리가 가능하고 각 영역별로 트랜잭션이 분리된다면 적용, 데이터보관주기에 따라 테이블에 데이터를 쉽게 지우는 것이 가능(파티션 테이블 드랍 기능) 데이터 보관 주기에 따른 테이블 관리가 용이
- List Partition : 대용량 데이터를 특정 값에 따라 분리/저장 할 수 있으나, Range Partition과 같이 데이터 보관주기에 따라 쉽게 삭제하는 기능을 제공X
- Hash Partition : 지정된 Hash 조건에 따라 해싱 알고리즘이 적용되어 테이블을 분리, 설계자는 테이블의 데이터가 어떻게 들어갔는지 알 수 없으며 성능향상을 위해 사용, 데이터 보관주기에따라 쉽게 삭제하는 기능을 제공X
▫ PK에 의한 테이블 분할
4. 테이블에 대한 수직/수평 분할 절차
(1) 데이터 모델링 완성
(2) 데이터베이스 용량 산정
(3) 대량 데이터가 처리되는 테이블에 대해 트랜잭션 처리 패턴을 분석
(4) 컬럼 단위(수직 분할)로 집중화된 처리가 발생하는지, 로우 단위(수평 분할)로 발생하느지 분석하여 테이블 분리
▪ 컬럼 수가 많을 경우 : 1:1 형태 수직 분할
▪ 컬럼 수는 적지만 데이터 용량이 많을 경우 : 파티셔닝
'Study IT > SQLD' 카테고리의 다른 글
SQLD_분산 데이터베이스와 성능 (0) | 2023.05.03 |
---|---|
SQLD_데이터베이스 구조와 성능 (2) | 2023.05.03 |
SQLD_반정규화 (0) | 2023.04.28 |
SQLD_정규화 (0) | 2023.04.28 |
SQLD_성능 데이터 모델링의 개요 (0) | 2023.04.27 |