파티셔닝
파티셔닝을 통해 얻을 수 있는 이점
- 성능 향상
- 경합 분산
- 가용성 향상
Range 파티션
특정 기준으로 범위를 지정해 나누는 방법.
예시로 특정 날짜를 기준 파티셔닝 하는 경우가 있다.
create table test1 (
range_key_column date NOT NULL,
data varchar2(20)
)
partition by range (range_key_column)
(
partition part1 values less than(to_date("20220401","YYYYMMDD"))
partition part2 values less than(to_date("20220701","YYYYMMDD"))
)
특징
- 과거 파티션에 대량 변경이나 백업 또는 복구를 진행하는 중에도 최신 파티션을 통한 조회, 변경, 삭제는 정상적으로 진행할 수 있다.
Interval 파티셔닝
Range 파티션 처리를 한 테이블의 경우, High value를 초과하는 값이 들어오기 전에 파티셔닝을 해주지 않으면 Insert 실패로 장애가 발생할 수도 있다. 이에, 이러한 문제를 방지하기 위해 11g부터 인터벌 파티셔닝이라는 기능을 지원해주기 시작했다.
→ 적절한 파티션이 존재하지 않을 때 사전 정의한 규칙에 따라 자동으로 파티션을 만들어주는 기능이다.
List 파티션
사용자가 지정한 불연속적인 값의 목록으로 데이터를 분할하고자 할 때 사용함.
특정한 값으로 구분하는 파티셔닝 방법이며, 단일 컬럼으로만 파티션할 수 있다.
특징
- Between 조건일 때도 파티션 Prunning 작동함.
- 입력 공간을 찾지 못해 에러가 발생할 수 있기에 파티션 키에 정의되지 않은 값을 처리하는 default 파티션을 추가해야함.
- 다른 파티션 키 값을 가지는 파티션에서 대량 변경이나 백업 또는 복구를 진행하더라도 조회, 변경, 삭제를 정상적으로 진행할 수 있다.
Hash 파티션
DBMS가 정한 해시 알고리즘에 따라 임의로 데이터를 분할하여 저장하며, 파티션 기준으로 여러 컬럼을 선택할 수 있다.
특징
- 값의 분포가 고르지 않을 때 특정 파티션에 데이터가 몰리는 현상이 생길 수 있다.
- 이를 해결하는 옵션 존재 x → 때문에 데이터 분포가 고른 컬럼을 파티션 키로 선정해야함.
- DML 경합을 분산하는 데에 효율적이다.
- 입력 공간을 찾지 못해 에러가 발생하는 현상이 발생하지 않는다.
- ‘=’ 조건, 또는 IN-List 조건일 때만 작동한다.
파티션 Pruning
정적 파티션 Pruning
- 파티션 키 컬럼을 상수 조건으로 조회 시 작동.
- 액세스할 파티션이 쿼리 최적화 시점에 미리 결정됨.
- 실행계획의 Pstart와 Pstop 컬럼에 액세스할 파티션 번호가 출력됨
- 파티션 컬럼에 IN-List 조건 사용 시 상수 값이더라도 KEY(I)로 표시됨.
동적 파티션 Pruning
- 파티션 키 컬럼을 바인드 변수로 조회 시 작동.
- 실행 시점에서 사용자가 입력한 값에 따라 프루닝 범위가 결정됨.
- 실행계획에서 Pstart와 Pstop 컬럼이 KEY로 표시됨.
- 조인 컬럼 기준으로 파티셔닝 되어 있어도 동적 Prunning 작동
- NL 조인에서도 inner 테이블일 때 동적 Prunning 발생함.
서브쿼리 Pruning
조인에서 사용되는 고급 파티션 Prunning 기법. 조인 필터와 함께 8i 이전에는 서브쿼리 Prunning이, 11g 이후부턴 조인 필터 Prunning이 동작한다.
Recursive 서브쿼리를 이용한 동적 파티션 Prunning. 액세스해야할 파티션 번호 목록을 특별한 쿼리를 통해 구해 이를 이용해 필요한 파티션만 스캔한다.
- 실행계획에선 KEY(SQ)로 표시된다.(SubQuery)
- Prunning 시 드라이빙 테이블을 한 번 더 읽게 되므로 경우에 따라 총 비용이 더 증가할 수 있다.
- 때문에, 서브쿼리 Prunning 적용 여부는 옵티마이저가 비용을 고려해 결정함.
아래와 같이 설정 시 옵티마이저에 의해 계산된 비용과 상관없이 항상 서브쿼리 Prunning을 실시한다.
- _subquery_pruning_cost_factor = 1
- _subquery_pruning_reduction = 100
조인 필터 Pruning(블룸 필터 Pruning)
드라이빙 테이블을 한 번 더 액세스하는 서브쿼리 pruning을 보완하기 위해 11g부터 블룸 필터 알고리즘을 프루닝 방식.
- 실행계획에서는 part join filter create는 블룸 필터를 생성하는 단계를 의미한다.