Notice
Recent Posts
Recent Comments
05-21 00:03
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

-

[SQLD] #009 데이터 모델과 성능 - 대량 데이터에 따른 성능 본문

SQLD

[SQLD] #009 데이터 모델과 성능 - 대량 데이터에 따른 성능

choiht 2021. 4. 21. 18:00
반응형

목차

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

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

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

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

 

 


 

 

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

데이터 모델이 아무리 설계가 잘 되어있어도 대량의 데이터가 하나의 테이블에 집약되어있고, 하나의 하드웨어 공간에 저장되어있으면 성능저하가 일어난다. 이런 경우 트랜잭션이 분산 처리될 수 있도록 테이블 단위에서 분할의 방법을 적용할 필요가 있다. 

 

 

 

대량의 데이터가 처리되는 테이블에 성능이 저하되는 이유는 SQL 문장에서 데이터를 처리하기 위한 I/O 양이 증가하기 때문이다. 

만약 대량의 데이터가 하나의 테이블에 존재하게 되면 인덱스를 생성할 때 인덱스의 크기가 커지게 되고, 그렇게 되면 인덱스를 찾아가는 단계가 깊어지게 되어 조회의 성능에도 영향을 미친다. 조회 뿐만 아니라 입력/수정/삭제의 경우 더 많은 성능 저하를 일으킨다. 

 

 

하나의 테이블에 300개 이상의 칼럼을 가지고 있는 경우가 있다. 이렇게 많은 칼럼은 로우체이닝과 로우마이그레이션이 많아지게 되어 성능이 저하된다. 

 

- 로우체이닝 (Row Chaining) : 로우 길이가 너무 길어서 데이터 블록 하나에 데이터가 모두 저장되지 않고 두 개 이상의 블록에 걸쳐 하나의 로우가 저장되어있는 형태

- 로우마이그레이션 (Row Migration) : 데이터 블록에서 수정이 발생하면 수정된 데이터를 해당 데이터 블록에서 저장하지 못하고 다른 블록의 빈 공간을 찾아 저장하는 방식

 

 

 

 

 

 

 

 

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

도서정보 테이블에 칼럼수가 아주 많다고하자. (약 200개) 로우 하나의 길이가 10KB라고 하고 블록은 2K 단위로 쪼개져 있다고 가정한다. 또한 블록에 데이터는 모두 채워진다고 가정하면 대략 하나의 로우는 5블록에 걸쳐 데이터가 저장될 것이다. 

 

 

200개의 칼럼을 동시에 화면에 보여주면, 화면을 몇번 스크롤하면서 봐야한다. 따라서 이런 테이블에 트랜잭션이 발생될 때 어떤 칼럼에 집중적으로 발생하는지 분석하여 테이블을 쪼개면, 디스크 I/O가 감소하게 되어 성능이 개선된다. (아래 사진 참고)

 

 

 

 

 

 

 

 

 

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

테이블에 많은 양의 데이터가 예상될 경우 파티셔닝을 적용하거나 PK에 의해 테이블을 분할하는 방법을 적용할 수 있다. 

 

1. RANGE PARTITON 적용

Range Partition은 가장 많이 사용되는 파티셔닝의 기준이다. 대상 테이블이 날짜나 숫자값으로 분리가 가능하고, 각 영역별로 트랜잭션이 분리된다면 이 방법을 적용한다. 

 

아래 그림은 요금 테이블에 PK가 요금일자+요금번호로 구성되어있고 데이터 컨수가 1억 2천만건인 대용량 테이블이다. 이때 요금의 특성상 월 단위로 결제하는 경우가 많으므로 PK인 요금 일자의 년+월을 이용하여 12개의 파티션 테이블을 만들었다. 

 

 

 

 

 

 

2. LIST PARTITION 적용

지점, 사업소, 사업장, 핵심적인 코드값 등으로 PK가 구성되어있고 대량의 데이터가 있는 테이블이면 각각의 값에 의해 파티셔닝되는 List Partition을 적용할 수 있다. 

 

 

 

 

 

 

3. HASH PARTITION 적용

이 방법은 지정된 HASH 조건에 따라 해쉬 알고리즘이 적용되어 테이블이 분리되며, 설계자는 테이블에 데이터가 정확하게 어떻게 들어갔는지 알 수 없다. 

 

 

 

 

 

 

 

 

 

 

 

 

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

테이블에 대한 수평분할/수직분할에 대한 결정은 다음 4가지 원칙을 적용한다. 

 

1. 데이터 모델링을 완성한다.

2. 데이터베이스 용량산정을 한다.

3. 대량 데이터가 처리되는 테이블에 대해서 트랜잭션 처리 패턴을 분석한다. 

4. 칼럼 단위로 집중화된 처리가 발생되는지, 로우 단위로 집중화된 처리가 발생되는지 분석하여 집중화된 단위로 테이블을 분리하는 것을 검토한다. 

 

용량 산정은 어느 테이블의 데이터의 양이 대용량이 되는지 분석하는 것이다. 특정 테이블이 대용량인 경우 칼럼의 수가 너무 많은지 확인한다. 칼럼의 수가 많은 경우 트랜잭션의 특성에 따라 테이블을 1:1 형태로 분리할 수 있는지 검증한다. 반대로 칼럼의 수가 적지만 데이터 용량이 많아 성능저하가 예상되는 경우는 테이블에 대해 파티셔닝을 고려한다. 

 

 

 

 

 


출처
이 글의 내용은 모두 한국데이터베이스진흥원이 출판한 SQL 전문가 가이드 2013 Edition을 기본으로 한다.

 

 

반응형
Comments