01 기본개념
SQL 문이 수행해야 할 작업 범위를 여러개의 작은 단위로 나누어 여러 프로세스가 동시에 처리하는 것
(1) Query Coordinator 와 병렬 프로세스
Query Coordinator 는 병렬 SQL 문을 발행한 세션을 말하고,
병렬 서버 프로세스는 실제 작업을 수행하는 개별 세션들을 말한다.
(2) Infra-Operation Parallelism 과 Inter-Operation Parallelism
(3) 테이블 큐
* 생산자 / 소비자 모델
* 병렬 실행계획에서 생산자와 소비자 식별
(4) IN-OUT 오퍼레이션
S → P: PARALLEL_FROM_SERIAL
P → S: PARALLEL_TO_SERIAL
P → P: PARALLEL_TO_PARALLEL
PCWP: PARALLEL_COMBINED_WITH_PARENT
PCWC: PARALLEL_COMBINED_WITH_CHILD
(5) 데이터 재분배
RANGE: order by 또는 sort group by 를 병렬로 처리할 때 사용
HASH: 조인이나 hash group by 를 병렬로 처리할 때 사용
BROADCAST: QC 또는 첫 번째 서버 집합에 속한 프로세스들이 각각 읽은 데이터를 두 번째 서버 집합에 속한 "모든" 병렬 프로세스에게 전송하는 방식
KEY: 특정 컬럼을 기준으로 테이블 또는 인덱스를 파티셔닝할 대 사용하는 분배 방식으로서, 실행계획에는 'PARTITION (KEY)' 로 표시된다.
ROUND-ROBIN: 파티션 키, 정렬 키, 해시 함수 등에 의존하지 않고 반대편 병렬 서버에 무작위로 데이터를 분배할 때 사용된다.
(6) Granule
데이터를 병렬로 처리할 때 일의 최소단위, 병렬 서버는 한번에 하나의 Granule 씩만 처리한다.
* 블록기반 Granule (=블록 범위 Granule)
* 파티션 기반 Granule (=파티션 Granule)
- Partition_Wise 조인 시
- 파티션 인덱스를 병렬로 스캔할 때
- 파티션 인덱스를 병렬로 갱신할 때
- 9iR1 이전에서의 병렬 DML
- 파티션 테이블 또는 파티션 인덱스를 병렬로 생성할 때
(7) 병렬 처리 과정에서 발생하는 대기 이벤트
* 대기 이벤트 모니터링
* 대기 이베트 해소
02 병렬 Order by 와 Group by
(1) 병렬 Order by
(2) 병렬 Group by
* Group By 가 두 번 나타날 때의 처리과정
03 병렬조인
병렬 조인 메커니즘을 이해하는 핵심 원리는 병렬 프로세스들이 서로 독립적으로 조인을 수행할 수 있도록 데이터를 분배하는데 있다.
1. 파티션 방식: Partition-Pair 끼리 조인 수행
2. Broadcast 방식: 한쪽 테이블을 Broadcast 하고 나서 조인 수행
(1) 둘 다 같은 기준으로 파티셔닝된 경우 - Full Partition Wise 조인
(2) 둘 중 하나만 파티셔닝된 경우 - Partial Partition Wise 조인
(3) 둘 다 파티셔닝 되지 않은 경우 - 동적 파티셔닝
(4) 둘 다 파티셔닝 되지 않은 경우 - Broadcast 방식
04 PQ_DISTRIBUTE 힌트
(1) pq_distribute 힌트의 용도
(2) 구문 이해하기
(3) 분배방식 지정
05 병렬 처리에 관한 기타 상식
(1) Direct Path Read
오라클은 병렬방식으로 Full Scan 할 때는 버퍼 캐시를 거치지 않고 곧바로 PGA 영역으로 읽어들이는 Direct Path Read 방식을 사용한다.
(2) 병렬 DML
(3) 병렬 인덱스 스캔
(4) 병렬 NL 조인
* 병렬 인덱스 스캔으로 드라이빙 하는 경우
* 병렬 NL 조인의 효용성
(5) 병렬 쿼리와 스칼라 서브쿼리
(6) 병렬 쿼리와 사용자 정의 함수
* parallel_enable 키워드 역할
(7) 병렬 쿼리와 ROWNUM
SQL에 rownum 을 포함하면 쿼리문을 병렬로 실행하는 데에 제약을 받게 되므로 주의해야 한다.
(8) 병렬처리시 주의사항
병렬처리 기법을 사용하는 것이 좋을 때
* 동시사용자 수가 적은 애플리케이션 환경에서 직렬로 처리할 때보다 성능 개선 효과가 확실할 때
* OLTP성 시스템 환경이라도 작업을 빨리 완료함으로써 직렬로 처리할 때보다 오히려 전체적인 시스템 리소스 사용률을 감소시킬 수 있을 때