대량 데이터발생에 따른 테이블 분할 개요
① 대량의 데이터가 존재하는 테이블에 많은 트랜잭션이 발생하여 성능이 저하되는 테이블 구조에 대해 수평/수직 분할 설계를 통해 성능 저하를 예방할 수 있음
•
테이블의 데이터는 Block 단위로 디스크에 저장된다
◦
블록 장치는 개별 바이트 단위가 아닌 일정 크기(block) 단위로 접근하는 장치를 말하는 것으로 간단히 말하면 하드 디스크와 같은 대용량 저장 장치를 말한다
◦
칼럼이 많아지게 되면 하나의 로우를 저장 시 물리적인 디스크 내 여러 블록에 데이터가 저장될 가능성이 높아짐
◦
즉 하나의 행을 읽더라도 여러 개의 블록을 읽어야함
◦
자연스레 해당 SQL문의 Block I/O가 많아짐
•
대용량 테이블에서 발생할 수 있는 현상
◦
로우 체이닝(Row Chaining) : 로우 길이가 너무 길어서 데이터 블록 하나에 데이터가 모두 저장되지 않고 두 개 이상의 블록에 걸쳐 하나의 로우가 저장되어 있는 형태
◦
로우 마이그레이션 (Row Migration) : 데이터 블록에서 수정이 발생하면 수정된 데이터를 해당 데이터 블록에서 저장하지 못하고 다른 블록의 빈 공간을 찾아 저장하는 방식
•
로우 체이닝과 로우 마이그레이션이 발생하여 많은 블록에 데이터가 저장되면 데이터 조회 시 절대적인 Block I/O의 횟수가 많아지게 된다.
SQL 메모리(block) disk
◦
I/O는 입력(Input)/출력(Output)의 약자로, 컴퓨터 및 주변장치에 대하여 데이터를 전송하는 프로그램, 운영 혹은 장치를 일컫는 말, 프로세서와 메모리, 확장 슬롯, 마더보드에서 일어나는 데이터 전송도 I/O 라고 일컬어집니다.
•
Block I/O의 횟수가 많아지면 Disk I/O를 할 가능성도 높아진다.
•
Disk I/O를 하게 되는 경우 성능이 급격히 저하 된다.
한 테이블에 많은 수의 칼럼을 가지고 있는 경우
•
칼럼수가 많은 테이블은 SELECT시 Block I/O의 수가 많아짐
•
Block I/O가 많아지면 자연스레 Disk I/O의 양이 증가될 가능성이 높아짐
•
Disk I/O가 많아지면 성능이 저하됨
•
이럴 경우 지나치게 많은 칼럼이 존재하는 테이블을 수직분할하면 성능이 향상될 수 있음
SELECT
발행기관명
, 수량
, 공고일
, 발행일
FROM 도서정보
WHERE 초판년 = '2002'
;
SQL
복사
한 테이블에 많은 수의 칼럼을 가지고 있는 경우 - 수직 분할
SELECT
발행기관명
, 수량
, 공고일
, 발행일
FROM 도서정보
WHERE 초판년 = '2002'
;
SQL
복사
•
전자출판유형에 대한 트랜잭션이 독립적으로 발생이 되는 경우가 많아 1:1 관계로 수직분할
•
대체제품에 대한 유형의 트랜잭션이 독립적으로 발생되는 경우가 많이 있어 1:1 관계로 수직분할
•
분리된 테이블은 칼럼의 수가 적으므로 로우마이그레이션과 로우체이닝이 많이 줄어들 수 있다
•
도서정보 테이블 조회시에도 디스크 I/O가 줄어들어 성능이 좋아짐
O(M^N)
대용량 테이블 성능 향상 방안 - 수평분할
•
RANGE PARTITION 적용
◦
요금테이블에 PK가 요금일자+요금번호로 구성되어 있고 데이터건수가 1억2천만 건인 대용량 테이블의 경우
◦
하나의 테이블로는 너무 많은 데이터가 존재하므로 인해 성능이 느린 경우에 해당
◦
요금의 특성상 항상 월 단위로 데이터 처리를 하는 경우가 많으므로 PK인 요금일자의 년+월을 이용하여 12개의 파티션 테이블을 생성함
◦
데이터보관주기에 따라 테이블에 데이터를 쉽게 지우는 것이 가능하므로(파티션 테이블을 DROP하면 되므로) 데이터 보관주기에 따른 테이블 관리가 용이
•
LIST PARTITION 적용
◦
고객 테이블에 데이터가 1억 건이 있는데 하나의 테이블에서 데이터를 처리하기에는 SQL문장의 성능이 저하되어 지역을 나타내는 사업소코드별로 LIST PARTITION을 적용
◦
LIST PARTITION은 대용량 데이터를 특정 값에 따라 분리 저장할 수는 있으나 RANGE PARTITION과 같이 데이터 보관 주기에 따라 쉽게 삭제하는 기능은 제공될 수 없음
•
HASH PARTITION 적용
◦
hash 구조 ⇒ 칼럼 (숫자값) → function()→ 특정값 → 매핑 → 칼럼 → 값
◦
HASH PARTITION은 지정된 HASH 조건에 따라 해싱 알고리즘이 적용되어 테이블이 분리됨
▪
(가운데에서 hash function이 분산 처리해줌)
◦
설계자는 테이블에 데이터가 정확하게 어떻게 들어갔는지 알 수 없음
◦
성능 향상을 위해 사용하며 데이터 보관 주기에 따라 쉽게 삭제하는 기능은 제공될 수 없다.
•
테이블에 대한 수평 분할/수직 분할의 절차
① 데이터 모델링을 완성한다.
② 데이터베이스 용량 산정을 한다.
③ 대량 데이터가 처리되는 테이블에 대해서 트랜잭션 처리 패턴을 분석한다.
④ 칼럼 단위로 집중화된 처리가 발생하는지,
로우 단위로 집중화된 처리가 발생되는지 분석하여 집중화된 단위로 테이블을 분리하는 것을 검토한다.