6.3 파티션을 활용한 DML 튜닝
6.3.1 테이블 파티션
- 파티셔닝은 테이블 또는 인덱스 데이터를 특정 컬럼(파티션 키) 값에 따라 별도 세크먼트에 나눠서 저장하는 것
<파티션이 필요한 이유>
(1) 관리적측면 : 파티션 단위 백업, 추가, 삭제, 변경 --> 가용성 향상
(2) 성능 측면 : 파티션 단위 조회 및 DML, 경합 또는 부하 분산.
1) Range 파티션 (오라클 8i 이후)
- 주로 날짜 컬럼을 기준으로 파티셔닝함.
* 파티션 테이블에 대한 SQL 성능 향상 원리는 파티션 Pruning에 있음. --> 파티션 프루닝이란 SQL 하드파싱이나 실행 시점에 조건절을 분석해서, 읽지 않아도 되는 파티션 세그먼트를 액세스 대상에서 제외하는 기능.
* 파티션도 클러스터, IOT와 마찬가지로 관련있는 데이터가 물리적으로 인접하도록 저장하는 클러스터링 기술에 속함.
-> 클러스터는 데이터를 블록단위로 모아 저장하지만, 파티셔닝은 세그먼트 단위로 모아서 저장한다. 그리고 IOT는 데이터를 정렬된 순서로 저장하는 구조. (추가 공부 필요.)
2) 해시파티션 (오라클 8i 이후)
- 파티션 키 값을 해시 함수에 입력해서 반환 받은 값이 같은 데이터를 같은 세그먼트에 저장하는 방식.
- 사용자는 파티션의 개수만 결정하고, 오라클 내부 해시함수가 데이터 분산 함.
- 해시 파티션의 파티션 기준 선정은 고객ID처럼 변별력이 좋고 데이터 분포가 고른 컬럼을 선정해야 효과적.
- 조건절 비교값에 똑같은 해시 함수를 적용함으로써 읽을 파티션을 결정. -- 테스트 필요
- 해시 알고리즘 특성상 등치 조건 또는 IN-List 조건으로 검색할 때만 파티션 Pruning 작동
CREATE TABLE USER(USERID VARCHAR(5), USERNAME VARCHAR(10)) PARTITION BY HASH(USERID) PARTITION 4; -- 파티션 4개 생성 |
3) 리스트 파티션 (9i이후)
- 사용자가 정의한 그룹핑 기준에 따라 데이터를 분할 저장하는 방식
6.3.2 인덱스 파티션
- 테이블 파티션과 인덱스 파티션은 구분되어야 함.
<인덱스 종류>
(1) 로컬 파티션 인덱스 - 각 테이블 파티션과 인덱스 파티션이 1:1 대응 관계가 되도록 오라클이 자동으로 관리. (예를들어, 옷장서랍을 계절별로 나눠고 계절별로 별도 색인을 만드는 것)
(2) 글로벌 파티션 인덱스 - 로컬이 아닌 파티션 인덱스는 '모두' 글로벌 파티션 인덱스이며, 테이블 파티션과는 독립적인 구성을 갖는다
(3) 비파티션 인덱스
1) 로컬 파티션 인덱스
- 오라클이 자동으로 관리해주므로 , 테이블 파티션 구성을 변경 하더라도 인덱스를 재생성할 필요가 없음.
- 피크 시간대가 아니면 서비스 중단없이 작업 가능
2) 글로벌 파티션 인덱스
- 파티션이 테이블과 다르게 구성된 인덱스. 파티션 유형이 다르거나, 파티션 키가 다르거나, 파티션 기준값 정의가 다른경우.
- 비파티션 테이블이어도 인덱스는 파티셔닝 가능 - 인덱스만 파티션 하는 것은 어떠한 경우에 사용하는 것이지..?!
- 글로벌 파티션 인덱스는 테이블 파티션 구성을 변경하는 순간 UNUSABLE상태로 변경되므로 바로 인덱스 재생성이 필요하며 그동안 해당 테이블을 사용하는 서비스 중단해야 함.
3) 비파티션 인덱스
- 파티셔닝하지 않은 인덱스
- 비파티션 인덱스는 테이블 파티션 구성을 변경하는 순간 Unusable상태로 변경되므로, 곧바로 인덱스 재생성 필요. 그동안 해당 테이블을 사용하는 서비스 중단
Prefixed VS. Nonprefixed
- 인덱스 파티션 키 컬럼이 인덱스 구성상 왼쪽 선두컬럼에 위치하는지에 따른 구분.
'스터디 > 친절한SQL튜닝' 카테고리의 다른 글
5장 소트튜닝 (0) | 2019.04.20 |
---|---|
[4장] 조인 튜닝 (0) | 2019.04.20 |