681~697

기본 개념

SQL  문이 수행해야 할 작업 범위를 여러개의 작은 단위로 나누어 여러 프로세스 (또는 쓰레드 windows?) 가 동시에 처리하는 것

Query Coordinator (이하 QC)

병렬 작업이 실행될 때 필요한 프로세스를 확보하고 병렬로 처리하도록 사용자가 지시하지 않는 테이블 처리

병렬 서버로 산출물을 통합하는 작업

테이블 큐

한 서버집합 같 또는 서버 집합 같 데이터 전송을 위해 연결된 파이프 라인

select /*\+ ordered use_hash(e) full(d) noparallel(d) full(e) parallel(e 2) pq distribute(e broadcast none) \*/ *
from dept d, emp e
where d.deptno = e.deptno
order by e. ename

생산자와 소비자

select /*+ parallel (emp 2) \*/ * from emp

의 경우 TQ1 과 TQ2 가 생산된다고 하면

select * from TQ1

select \* from TQ2 

해서 결과값을 추려낸후 병합

이벤트명
클래스
설명
PX Deq: Execute Reply
idle
QC가 각 병렬 서버에게 작업을 배분하고서 작업이 완료되기를

기다리는상태
PX Deq: Execution Msg
idle
병렬 서버가 자신의 임무를 완수하고서 다른 병렬 서버가 일을

마치기를 기다리는 상태. QC 또는 소비자 병렬 서버에게 데이

터 전송을 완료했을 때 나타남
PX Deq: Table Q Normal
other
메시지 수신 대기. 메시지 큐에 데이터가 쌓이기를 기다리는 상태
PX Deq Credit: send blkd
idle
메시지 송신 대기. QC 또는 소비자 병렬 서버에게 전송할 데이

터가 있는데 블로킹 된 상태. 

생산자 프로세스가 메시지 큐를 통해 데이터를 전송하려고 하는

데 어떤 이유에서건 소비자 프로세스가 버떠에서 데이터를 빨리

꺼내가지 않을때 발생
PX Deq Credit: need buffer
idle
데이터를 전송하기 전에 상대펀 병렬 서버 또는 QC로부터

credit 비트를 얻으려고 대기하는 상태. 오라클 측의 설명(메타

링크 문서번호 271767. 1)에 의하면 PX Oeq Credit: send blkd

과 PX Oeq Credit: need buffer 는 거의 같은 대기 이벤트이

고, 내부적인 이유로 전자는 로컬 시스템에서 자주 발샘하고, 후

지는 RAC 시스템에서 자주 발생한다고 함

Granule

병렬로 처리할때 최소 일의 단위

대기 이벤트 모니터링

SQL> select /*\+ parallel(emp ename) * / * from emp order by ename

select decode(a .qcserial#, null, 'PARENT',' 'CHILD') ST_LVL
 , a. server_set "SET", a.sid, a . serial#, status, event,wait class
 from v$px_session a, v$session b
 where a.sid = b.sid
 and a.qcsid = 5284
 order by a.qcsid, ST_LVL desc, a.server_group, a.server set

대기 이벤트 해소

insert /\* + append * / into t1
select /*\+ full(t2) parallel(t2 4) \*/ * from t2;

  • append 힌트 :
    1. noarchivelog 모드 일때 or nologing 으로 표시된 테이블 을 대상으로 작업중일 때 리두로그를 생성하지 않음
    2. 인덱스가 걸려있는 항목이면 인덱스 로그는 무조건 남김

대량인서트

사용자 접근이 낮은 시간에 대량 인서트 작업시.

1. 해당 세션 parrleldml 옵션 enable
SQL> alter session enable parallel DML;

2. insert 대상 테이블 nologing 으로 변경
SQL> alter table t1 nologging

3. 대량 인서트 시작
SQL> insert /\* + append * / into t1
select /*\+ full(t2) parallel(t2 4) \*/ * from t2;

4. 테이블 loging 으로 변경
SQL> alter table t1 loging

5. 해당 세션 parrleldml 옵션 disable
SQL> alter session disable parallel DML;