병렬처리
배치 프로그램
- 주로 대용량 데이터 처리
- 일련의 작업을 하나의 작업 단위로 묶어서 일괄 처리
- 정기적으로 반복 실행되거나 사전에 정의해 둔 조건을 충족할 때 자동 실행됨.
- OTLP, DW/OLAP 시스템 모두에서 활용한다.
스타일
- 절차형으로 작성된 프로그램
- SQL 결과집합을 루프 내에서 한건씩 Fetch 하면서 또 다른 SQL을 반복해서 수행하는 형태를 이야기함. → 인덱스 구성 중요
- One SQL 위주로 작성된 프로그램
튜닝
- 전체 처리속도 최적화를 목표로 튜닝하여야함.
- 튜닝 대상 선정 시 개별 서비스, 또는 프로그램 수행시간 단축보다 전체 프로세스 수행시간을 단축하는 데 더 큰 목표를 두어야함.
- 필요 이상의 병렬도 지정 x
- 배치 윈도우를 조절하여 프로그램 수행 시간대를 적절히 분산하면 개별 프로그램 튜닝보다 더 큰 효과를 얻을 수도 있음.
- Array Processing 적극 활용하여야함.
- 임시 테이블을 잘 활용하여야함.
병렬처리
하나의 작업을 여러 개의 단위로 나뉘어 여러 프로세스가 동시에 처리할 수 있도록 하는 방법
On-Demand 배치: 사용자 요청 시 수행.
정기 배치: 정해진 기간에 정기적으로 수행.
이벤트성 배치: 특정 조건 충족 시 수행.
QC
병렬 SQL문을 수행한 세션.
다음과 같은 작업을 진행
- 병렬서버집합 할당
- 서버 풀로부터 필요한 만큼 서버 프로세스 확보, 부족분은 새로 생성
- 각 병렬 서버에게 작업 할당
- 병렬처리 대상이 아닌 작업 관리
- 각 병렬서버 산출물 통합
병렬 프로세스
실제 병렬 작업을 수행하는 개별 세션. 모든 처리 종료 후, 일괄 해제하고 자원을 OS에 반환한다.
Intra Operation Parallelism
서로 배타적인 범위를 독립적으로 처리하는 것.
개별 서버 프로세스가 각각 자신의 작업 수행 후 QC가 최종 머지하는 방식. → 서버 프로세스 수가 많을 시 QC에 부하가 걸려 비효율이 발생할 수 있다.
Inter Operation Parallelism
한편의 서버집합에 속한 프로세스들이 읽은 데이터를 반대편 서버집합(or QC)에 전송하는 작업을 병렬로 동시에 진행하는 것.
IN-OUT 오퍼레이션
- PARALLEL_FROM_SERIAL: QC가 읽은 데이터를 테이블 큐를 통해 병렬 서버 프로세스 집합으로 전달
- PARALLEL_TO_SERIAL: 병렬 서버 프로세스가 처리한 데이터를 QC에게 전송
- PARALLEL_TO_PARALLEL: 한 서버 집합이 반대편 서버 집합에 데이터 전송
- PARALLEL_COMBINED_WITH_PARENT: 한 병렬 프로세스가 현재 스텝과 부모 스텝 모두 처리
- 프로세스간 통신 발생 x
- PARELLEL_COMBINED_WITH_CHILD: 한 병렬 프로세스가 현재 스텝과 자식 스템 모두 처리
- 프로세스간 통신 발생 x
데이터 재분배
RANGE
- Order by, Group by 를 병렬처리 시 사용
- 두 번째 서버집합의 프로세스마다 처리 범위를 지정 후 첫 번째 서버집합이 정렬 키 값에 따라 분배
- QC는 각 프로세스에 작업 범위만 할당하고 직접 참여하지는 않음
HASH
- 조인이나 Hash group by 를 병렬 처리 시 사용
- 조인 키나 Group by key 값을 해시 함수 적용 후 데이터 분배
- P→P, S→P 분배 가능
Broadcast
- QC 혹은 첫 서버집합 프로세스가 각기 데이터를 두 번째 서버집합의 모든 병렬 프로세스에 전송
- 크기가 매우 작은 테이블 존재 시 사용
- P→P, S→P 방식 가능
KEY
- 특정 칼럼 기준으로 데이터나 인덱스 파티셔닝하는 분배 방식
- 실행계획 상 PARTITION(KEY)로 표기
- Partial Partition-wise 조인, CTAS, 병렬로 글로벌 파티션 인덱스 생성 시 발생
Round-Robin
- 파티션 저렬 키, 해시 함수 등에 의존하지 않고 반대편 병렬 서버에 무작위 데이터 분배
Granule
데이터를 병렬로 처리할 때 일의 최소 단위. 병렬 프로세스는 한 번에 하나의 Granule만 처리한다.
블록 기반 Granule
QC가 테이블로부터 읽어야 할 일정 범위의 블록을 각 병렬 프로세스에게 할당한다.
병렬 프로세스가 한 Granule에 대한 일을 끝마치면 이어서 다른 Granule을 할당한다. → 프로세스간 처리량 편차 거의 발생 x
파티션 여부, 파티션 개수와 무관하게 병렬도 지정 가능.
파티션 기반 Granule
한 파티션에 대한 작업을 한 프로세스가 모두 처리하며, 아래와 같은 작업 수행할 때 사용된다.
- Partition-Wise 조인 시
- 파티션 인덱스를 병렬로 스캔할 때(Index Range Scan, Index Full Scan)
- 파티션 인덱스를 병렬로 갱신할 때
- 파티션 테이블 또는 파티션 인덱스를 병렬로 생성할 때
병렬 조인 방법
- 양 쪽 모두 Join 컬럼에 대해 Partition 되어 있을 경우
- 한 쪽 테이블만 Join 컬럼에 대해 Partition 되어 있을 경우
- 둘 다 Join 컬럼에 대해 Partition 없어서 동적 파티셔닝
- 둘 다 Join 컬럼에 대해 Partition 없이 Broadcast
Full Partition Wise(양쪽 모두 Join컬럼 기준 Partition)
순서
- 양쪽 테이블을 각각 같은 파티션으로 나눠 파티션 분배
- 각 프로세스 내부에서 조인
- 최종 결과 QC 전송
플랜
PX PARTITION RANGE ALL
PARTITION RANGE ITERATOR
특징
- 하나의 서버집합만 필요(Partition degree * 1개 Process)
- 파티션 기반 병렬처리이므로 파티션 갯수 이하로 병렬도 제한
- 파티션 방식, 조인 방식에 무관하게 동작 가능
- 양 테이블이 같은 컬럼, 같은 기준으로 파티션 되어있어야 가능
Partial Partition Wise(한 쪽 테이블 Join 컬럼에만 Partition)
순서
- 첫 서버 집합이 비 파티션 테이블을 파티션 테이블 기준으로 동적 파티셔닝
- 각 프로세스 내부에서 조인
- 최종결과 QC에 전송
플랜
PARTITION (KEY)
PART (KEY)
특징
- 두 개의 서버집합 필요(Partition degree * 2개 Process)
- 각 서버집합 간 데이터 통신 발생
둘 다 Join 컬럼에 대해 Partition 없어서 동적 파티셔닝
순서
- 첫 서버 집합이 outer 테이블 읽어 두 번째 서버 집합에 분배
- 첫 서버 집합이 inner 테이블 읽어 두 번쨰 서버 집합에 분배
- 두 번째 서버 집합이 각 프로세스 내부에서 조인
- 최종 결과 QC에 전송
플랜
PQ Distribute HASH
PX SEND HASH
특징
- 조인 전에 메모리나 TEMP TBS 를 많이 사용
- 전체 범위 처리 필요
- 조인컬럼 내부 데이터 분포 불균등할 경우 프로세스 간 처리 데이터 차이 발생 가능
- 둘 다 대용량이고 조인컬럼 데이터 분포 균일할 때 효과적
둘 다 Join 컬럼에 대해 Partition 없어서 broadcast
순서
- 첫 서버 집합이 작은 테이블 전체를 두 번쨰 집합의 모든 프로세스에 전송
- 첫 서버 집합이 큰 테이블을 두 번째 집합의 각 프로세스에 동적 파티셔닝 해 전송
- 두 번째 서버 집합이 각 프로세스 내부에서 조인
- 최종 결과 QC에 전송
특징
- broadcast 되는 테이블은 비교적 작아서 Serial 하게 읽는것이 일반적
- 조인 방식에 무관하게 동작 가능
- 작은 테이블은 전체범위 필요. 큰 테이블은 부분범위 가능
'Database' 카테고리의 다른 글
With 구문 (0) | 2023.06.10 |
---|---|
트랜잭션 고립화 레벨 (0) | 2023.06.10 |
파티셔닝 (0) | 2023.06.10 |
인덱스 Batch I/O (0) | 2023.06.10 |
Index Scan (0) | 2023.06.10 |