--并行DML Oracle文档将并行DML一词的范围限制为只包括INSERT/UPDATE/DELETE/MERGE。 --显示启用并行DML EODA@PROD1> alter session enable parallel dml; Session altered. --确认当前会话启用并行DML EODA@PROD1> select pdml_enabled from v$session where sid = sys_context('userenv' ,'sid'); PDM --- YES EODA@PROD1> select sys_context('userenv', 'sid') from dual; --查看当前sid SYS_CONTEXT('USERENV','SID') ---------------------------------------------------------------------------------------------------- 55 --执行UPDATE EODA@PROD1> update big_table set status = 'done'; --与此同时在另一会话查询PDML操作的事务信息 EODA@PROD1> column program format a30 EODA@PROD1> column trans_id form a20 EODA@PROD1> select a.sid, a.program, b.start_time, b.used_ublk, 2 b.xidusn ||'.'|| b.xidslot || '.' || b.xidsqn trans_id 3 from v$session a, v$transaction b 4 where a.taddr = b.addr 5 and a.sid in ( select sid 6 from v$px_session 7 where qcsid = 55) 8 order by sid 9 / SID PROGRAM START_TIME USED_UBLK TRANS_ID ---------- ------------------------------ -------------------- ---------- -------------------- 33 oracle@ocm1 (P002) 12/01/16 01:12:23 244 11.0.944 42 oracle@ocm1 (P001) 12/01/16 01:12:23 1 12.12.947 48 oracle@ocm1 (P000) 12/01/16 01:12:23 1 16.29.930 55 sqlplus@ocm1 (TNS V1-V3) 12/01/16 01:12:23 1 14.33.957 56 oracle@ocm1 (P003) 12/01/16 01:12:23 19 15.21.1148 --在一个新的会话中查看执行计划 EODA@PROD1> explain plan for update big_table set status = 'done'; Explained. EODA@PROD1> select * from table(dbms_xplan.display(null,null,'BASIC +PARALLEL')); PLAN_TABLE_OUTPUT ---------------------------------------------------------------------------------------------------- Plan hash value: 2685615093 ------------------------------------------------------------------------ | Id | Operation | Name | TQ |IN-OUT| PQ Distrib | ------------------------------------------------------------------------ | 0 | UPDATE STATEMENT | | | | | | 1 | UPDATE | BIG_TABLE | | | | | 2 | PX COORDINATOR | | | | | | 3 | PX SEND QC (RANDOM)| :TQ10000 | Q1,00 | P->S | QC (RAND) | | 4 | PX BLOCK ITERATOR | | Q1,00 | PCWC | | | 5 | TABLE ACCESS FULL| BIG_TABLE | Q1,00 | PCWP | | ------------------------------------------------------------------------ 12 rows selected. --由于新会话此前并未启用并行DML,所以看到的并不是全并行的执行计划,此处的UPDATE是串行执行的。 EODA@PROD1> alter session enable parallel dml; --启用PDML Session altered. EODA@PROD1> explain plan for update big_table set status = 'done'; Explained. EODA@PROD1> select * from table(dbms_xplan.display(null,null,'BASIC +PARALLEL')); PLAN_TABLE_OUTPUT ---------------------------------------------------------------------------------------------------- Plan hash value: 2864480563 --------------------------------------------------------------------------- | Id | Operation | Name | TQ |IN-OUT| PQ Distrib | --------------------------------------------------------------------------- | 0 | UPDATE STATEMENT | | | | | | 1 | PX COORDINATOR | | | | | | 2 | PX SEND QC (RANDOM) | :TQ10001 | Q1,01 | P->S | QC (RAND) | | 3 | INDEX MAINTENANCE | BIG_TABLE | Q1,01 | PCWP | | | 4 | PX RECEIVE | | Q1,01 | PCWP | | | 5 | PX SEND RANGE | :TQ10000 | Q1,00 | P->P | RANGE | | 6 | UPDATE | BIG_TABLE | Q1,00 | PCWP | | | 7 | PX BLOCK ITERATOR | | Q1,00 | PCWC | | | 8 | TABLE ACCESS FULL| BIG_TABLE | Q1,00 | PCWP | | --------------------------------------------------------------------------- 15 rows selected. --启用PDML后,UPDATE也被并行执行。