문제 링크 : https://velog.io/@yooha9621/SQLP실기문제-대용량배치프로그램튜닝54번
1) 기존 쿼리 분석
기존 쿼리의 순서는 다음과 같다.
- 상품기본이력임시 테이블 병렬 FULL SCAN 후 TQ10000 테이블큐를 통해 브로드캐스팅
- 상품기본 테이블 병렬 FULL SCAN 후 브로드캐스팅으로 받은 상품기본이력임시 테이블과 해시 조인
- 코드 상세 테이블 병렬 FULL SCAN 후 TQ10001 테이블큐를 통해 브로드캐스팅
- (2)번에서 만들어진 조인 결과 데이터를 TQ10002 테이블큐를 통해 브로드캐스팅
- 브로드캐스팅으로 받은 (3)번 데이터와 (4)번 데이터 해시조인
- (5)번 데이터를 TQ10003 테이블큐를 통해 QC로 전송
2) 내가 생각한 튜닝 포인트🤔
테이블큐를 통해 모든 데이터가 브로드캐스팅 방식으로 재분배 되는데 이는 굉장히 부하가 클 것으로 예상된다.(그러니깐 저런 오류가 났겄지;; 😱 )
- 상품기본이력임시 테이블 OUTER 테이블로 설정 및 병렬 FULL SCAN
- 상품기본 테이블을 INNER 테이블로 설정 및 병렬 FULL SCAN 후 상품 기본의 가짓수가 어떻게 될지 모르기 때문에 브로드캐스팅말고 파티셔닝 조인을 한다.
이 때 ,INNER 테이블인 상품기본 테이블을 파티셔닝 한다.(실행계획에서 데이터가 훨씬 많으므로)
- 👉 FULL(B) pq_distribute(b,NONE,PARTITION)
- 상품기본 테이블과 상품기본이력임시 테이블을 해시조인한다.
- (3)번에서 만들어진 조인 결과 데이터를 OUTER 테이블로 설정
- 코드상세 테이블을 INNER 테이블로 설정 및 병렬 FULL SCAN 후 브로드캐스팅한다.
- 👉 FULL(C) pq_distribute(C,NONE,BRADCAST)
- (3)번 데이터와 (5)번 데이터를 해시조인한다.
- 👉 코드 상세 테이블은 데이터가 적은 게 명확하므로 swap_join_inputs으로 hash bulid input을 명시해준다. SWAP_JOIN_INPUTS(C)
- 상품상세 테이블을 INNER 테이블로 설정 및 병렬 FULL SCAN 후 (6)번 데이터와 조인하기 위해 해시 파티셔닝을 진행한다. 이 때 (6)번 데이터의 양이 현저히 적으므로 build input을 명시한다.
- 👉 FULL(D) pq_distribute(D,HASH,HASH) NO_SWAP_JOIN_INPUTS(D)
- 병렬도를 16으로 바꾼다.
- 👉 PARALLEL(A , 16) PARALLEL(B,16) PARALLEL(C,16) PARALLEL(D,16)
2) 변경한 쿼리
변경 전 쿼리
SQL> INSERT INTO 상품기본이력(...)
2> SELECT ....
3> FROM 상품기본이력임시 a, 상품기본 b, 코드상세 c, 상품상세 d
4> WHERE a. 상품번호= b. 상품번호
5> AND
6) /
변경 후 쿼리
SQL> INSERT INTO 상품기본이력(...)
2> SELECT ....
3> FROM 상품기본이력임시 a, 상품기본 b, 코드상세 c, 상품상세 d
4> WHERE a. 상품번호= b. 상품번호
5> AND
6) /