병렬 DML

  • 범위 : INSERT, UPDATE, DELETE, MERGE
  • PDML은 대량의 데이터 웨어하우스 환경에서 대량의 데이터를 벌크 update로 처리하는데 매우 효과적이다
  • 각 병렬 실행 서버는 독립적으로 트랜잭션을 수행하고, PDML 코디네이터 세션이 모두 커밋 또는 롤백을 수행한다.
  • alter session enable parallel dml; 구문으로 명시적으로 병렬 처리를 요청해야 PDML를 수행할 수 있다.
병렬 DML
세션1세션2
{code:sqlborderStyle=solid}
BIG_TABLE@THREE >select sid from v$mystat where rownum = 1;

SID



--
22

1 row selected.

BIG_TABLE@THREE >alter session enable parallel dml;

Session altered.

BIG_TABLE@THREE >update big_table set status = 'done';

| {code:sql|borderStyle=solid}
SYS@THREE >select a.sid, a.program, b.start_time, b.used_ublk, b.xidusn||'.'||b.xidslot||'.'||b.xidsqn trans_id
  2  from v$session a, v$transaction b
  3  where a.taddr = b.addr
  4  and a.sid in ( select sid from v$px_session where qcsid = 22)
  5  order by sid
  6  /

       SID PROGRAM                                          START_TIME            USED_UBLK TRANS_ID
---------- ------------------------------------------------ -------------------- ---------- -------------------
        22 sqlplus@primarydb (TNS V1-V3)                    12/06/12 15:18:30             1 10.0.5095
        23 oracle@primarydb (P002)                          12/06/12 15:18:31             1 2.15.4603
        24 oracle@primarydb (P004)                          12/06/12 15:18:31         11572 7.30.4049
        29 oracle@primarydb (P006)                          12/06/12 15:18:31         10258 1.22.3711
        33 oracle@primarydb (P000)                          12/06/12 15:18:31             1 3.7.5080
       770 oracle@primarydb (P007)                          12/06/12 15:18:31         10663 9.24.5123
       782 oracle@primarydb (P005)                          12/06/12 15:18:31         10702 8.17.4558
       787 oracle@primarydb (P001)                          12/06/12 15:18:31             1 6.7.5396
       792 oracle@primarydb (P003)                          12/06/12 15:18:31             1 4.1.4767

9 rows selected.

|

실행계획
{code:sqlborderStyle=solid}

BIG_TABLE@THREE >explain plan for
2 update big_table set status = 'done';

Explained.

BIG_TABLE@THREE >select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
































Plan hash value: 2864480563





























---

IdOperationNameRowsBytesCost (%CPU)TimeTQIN-OUTPQ Distrib





























---

0UPDATE STATEMENT17M98M18111 (1)00:03:38
1PX COORDINATOR
2PX SEND QC (RANDOM):TQ1000117M98M18111 (1)00:03:38Q1,01P->SQC (RAND)
3INDEX MAINTENANCEBIG_TABLEQ1,01PCWP
4PX RECEIVE17M98M18111 (1)00:03:38Q1,01PCWP
5PX SEND RANGE:TQ1000017M98M18111 (1)00:03:38Q1,00P->PRANGE
6UPDATEBIG_TABLEQ1,00PCWP
7PX BLOCK ITERATOR17M98M18111 (1)00:03:38Q1,00PCWC
8TABLE ACCESS FULLBIG_TABLE17M98M18111 (1)00:03:38Q1,00PCWP





























---

15 rows selected.

|
=> big_table에 인덱스가 있어, 테이블 update하는 단계와 인덱스 엔트리를 update하는 총 9개의 프로세스 작동
 

|| PDML 제약 ||
|{code:sql|borderStyle=solid}
1. 트리거기 작동하지 않는다
2. 명시적인 참조 무결성 제약을 지킬 수 없다
3. 커밋 또는 롤백할 때까지 액세스할 수 없다.
4. 트리거 기반인 advanced replication은 사용할 수 없다.
5. 비트맵 인덱스, LOB컬럼이 있는 파티션 테이블은, 하나의 파티션에 하나의 병렬 실행 서버만이 작동한다.
6. 분산 트랜잭션을 사용할 수 없다.
7. 클러스터 테이블은 사용할 수 없다.

|