분류

2019년 6월 17일 월요일

대용량 데이터 처리 3. 테이블 파티셔닝

1.테이블 파티셔닝은 언제씁니까? 

대용량 데이터 처리를 하다 보면 자주 대량의 데이터에 대한 DELETE/INSERT 가 발생합니다. 이럴경우 데이터의 양에 따라서 삭제지연이 발생하기도 하고, 대량의 데이터에 대한 집계처리를 할 때도 분할영역이 존재하지 않으면 인덱스를 사용하더라도 속도가 더딘 일이 자주 있습니다. 이럴 경우 테이블 분할이나 파티셔닝을 사용하고 있습니다.

일단 테이블 분할에 대한 기본적인 개념을 알아야 합니다. 기본 개념은 다음과 같습니다.
a. 테이블의 특정 컬럼만 자주 조회/변경 되는 경우 수직분할
b. 특정 값에 해당하는 데이터에 대한 조회/변경이 잦은 경우 수평분할
c. 범위(기간)에 따라 변동되는 데이터에 대한 조회/변경이 잦은 경우 범위분할

여기서 수직 분할은 컬럼 단위, 수평 분할은 데이터의 특정 값을 기준으로 파티션을, 범위 분할은 특정 열값의 범위로 파티셔닝을 합니다.

또한 개념에서 주의하셔야 할 점은 수직 분할의 경우 테이블의 설계를 물리적으로 분할한다는 개념이지 테이블의 PARTITION 으로 구현되는 것이 아닙닌다. 따라서 자세한 내용이 나오진 않습니다. 파티셔닝은 수평분할과 범위분할에 사용되나봅니다.

2. 파티셔닝 사용시 장점은 무엇입니까? 

오라클 IN 메모리 오버뷰

파티션을 분할 한경우 파티션 키를 통해 특정 파티션의 데이터만 엑세스 하는 것이 가능합니다. 불필요한 데이터를 로드할 필요가 없어 엑세스 성능이 향상됩니다.

또한 커다란 테이블을 물리적인 위치를 분산시켜 대량의 데이터 입출력에 따르는 IO 부하를 분산시키는 효과도 있습니다.

파티션 단위로 데이터를 관리할 경우 입/출력 속도에 매우 중대한 영향이 생깁니다. 개인적으로는 1000만건 이상의 데이터에 대한 일괄 삭제/입력이 잦을 삭제시간 15분~30분을 줄이기 위해 파티션에 대한 drop이나 truncate를 사용합니다.

데이터에 대한 백업,변경 등의 관리를 파티션 단위로 할 수 있습니다.


3. 파티셔닝 개념 

일단 그림을 첨부하겠습니다.

1. 오라클의 데이터 저장소는 물리적으로 하나 이상의 데이터 파일로 이루어집니다.

2. 테이블 스페이스는 논리적으로 데이터를 저장하는 장소로 하나 이상의 데이터 파일을 포함하고 있습니다.

3.테이블이나 인덱스는 기본적으로 하나의 테이블 스페이스에 저장됩니다.

4. 파티션 테이블은 하나 이상의 테이블 스페이스에 파티션을 저장할 수 있습니다.

5. 테이블 데이터의 파티셔닝 기준은 특정키의 값이나 범위일 수 있습니다.

따라서 테이블 파티셔닝을 할 경우 특정 범위의 데이터에 대한 입출력이 잦은 경우 범위파티셔닝(범위), 특정 항목값에 의해 데이터 그룹이 분리되는경우(리스트) 파티셔닝을 하여 서로 다른 테이블 스페이스에 배치하여 입출력을 분산시킬 수 있으며, 관리 편의성을 확보할 수 있습니다. 같은 테이블 스페이스 내에서 여러 파티션을 관리하는 경우도 있습니다. (이 경우에도 어느정도의 성능 향상을 기대할 수 있습니다.)

4. 파티셔닝 명령어 

전체적은 파티션에 대한 내용을 모두 기술하기엔 무리가 있으므로, 제가 자주 사용하는 파티션에 대한 내용 몇가지만 간략하게 기술하겠습니다.

가. 파티션 사용 

1) 리스트 파티션
ㄱ) 생성
리스트파티션은 컬럼의 특정 값에 따라 데이터를 분할할 수 있을 경우 사용합니다.

CREATE TABLE 테이블명
(
 컬럼명1 VARCHAR2(20)
, 컬럼명2 VARCHAR2(20)
)
PARTITION BY LIST (컬럼명1)
(
 PARTITION 파티션명1 VALUE('값1') TABLESPACE 테이블스페이스1
, PARTITION 파티션명2 VALUE('값2') TABLESPACE 테이블스페이스1
, PARTITION 파티션명3 VALUE('값3') TABLESPACE 테이블스페이스2
)

ㄴ) 추가
ALTER TABLE 테이블명 ADD PARTITION 파티션명4 VALUES('값4') TABLESPACE 테이블스페이스2;

ㄷ) 드롭
ALTER TABLE 테이블명 DROP PARTITION 파티션명4;

ㄹ) 비움
ALTER TABLE 테이블명 TRUNCATE PARTITION 파티션명3;

ㅁ) 조회
SELECT * FROM 테이블명 PARTITION (파티션명1);

주의 : PARTITION 테이블에 테이블 전체에 대한 인덱스가 걸려있을 경우 DROP이나 TRUNCATE 후 INDEX REBUILD 를 해야 합니다.

ALTER TABLE 인덱스명 REBUILD;

2) 범위 파티션
ㄱ) 생성
CREATE TABLE 테이블명(
  컬럼명1 VARCHAR2(20)
 , 컬럼명2 VARCHAR2(20)
)
PARTITION BY RANGE (컬럼명1)
(
 PARTITION 파티션1 VALUES LESS THAN ('01') TABLESPACE 스페이스1
PARTITION 파티션2 VALUES LESS THAN ('05') TABLESPACE 스페이스1
PARTITION 파티션3 VALUES LESS THAN ('10') TABLESPACE 스페이스2
)

ㄴ) 추가
ALTER TABLE 테이블명 VALUES LESS THAN ('20') TABLESPACE 스페이스3

특이사항 : RANGE 파티션은 LIST와 달리 1개 이상의 컬럼을 기준으로 작성할 수 있습니다.
예) : CREATE TABLE 테이블명(
  컬럼명1 VARCHAR2(20)
 , 컬럼명2 VARCHAR2(20)
)
PARTITION BY RANGE (컬럼명1, 컬럼명2 )
(
 PARTITION 파티션1 VALUES LESS THAN ('01', '2009') TABLESPACE 스페이스1
,  PARTITION 파티션2 VALUES LESS THAN ('05', '2014') TABLESPACE 스페이스1
,  PARTITION 파티션3 VALUES LESS THAN ('10', '2019') TABLESPACE 스페이스2
)

DROP이나 TRUNCATE의 경우 LIST PARTITION과 같습니다.

이상입니다. 수정이나 의견이 있으신 분은 댓글 달아주시면 고맙겠습니다.


연관된 문서가 있습니다.
대용량 데이터 처리 1. java 다중쓰레드 활용
대용량 데이터 처리 2. 오라클 병렬처리 parallel
대용량 데이터 처리 3. 테이블 파티셔닝
대용량 데이터 처리 4. DBMS_JOB

댓글 없음:

댓글 쓰기