병렬 INSERT 문에 NOAPPEND 힌트를 사용하면 데이터를 Conventional Path로 적재할 수 있습니다.
테스트를 위해 아래와 같이 테이블을 생성하고, _optimizer_gather_stats_on_load 파라미터를 FALSE로 설정하겠습니다.
-- 1-1
DROP TABLE t1 PURGE;
DROP TABLE t2 PURGE;
CREATE TABLE t1 (c1 NUMBER);
CREATE TABLE t2 (c1) AS SELECT ROWNUM FROM XMLTABLE ('1 to 1000000');
-- 1-2
ALTER SESSION SET "_optimizer_gather_stats_on_load" = FALSE;
아래는 병렬 DML이 활성화되지 않은 병렬 INSERT 문의 실행 계획입니다. QC가 데이터를 Conventional Path로 적재합니다.
-- 2
INSERT /*+ PARALLEL(2) */
INTO t1
SELECT * FROM t2;
--------------------------------------------------------------------------
| Id | Operation | Name | TQ |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | | | |
| 1 | LOAD TABLE CONVENTIONAL | T1 | | | | -- !
| 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 | T2 | Q1,00 | PCWP | |
--------------------------------------------------------------------------
Note
-----
- Degree of Parallelism is 2 because of hint
- PDML is disabled in current session
아래는 병렬 DML이 활성화된 병렬 INSERT 문의 실행 계획입니다. PX 서버가 데이터를 Direct Path로 적재합니다.
-- 3
INSERT /*+ PARALLEL(2) ENABLE_PARALLEL_DML */
INTO t1
SELECT * FROM t2;
------------------------------------------------------------------------------------
| Id | Operation | Name | TQ |IN-OUT| PQ Distrib |
------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | | | |
| 1 | PX COORDINATOR | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | Q1,00 | P->S | QC (RAND) |
| 3 | LOAD AS SELECT (HYBRID TSM/HWMB)| T1 | Q1,00 | PCWP | | -- !
| 4 | PX BLOCK ITERATOR | | Q1,00 | PCWC | |
| 5 | TABLE ACCESS FULL | T2 | Q1,00 | PCWP | |
------------------------------------------------------------------------------------
Note
-----
- Degree of Parallelism is 2 because of hint
아래는 병렬 DML이 활성화된 병렬 INSERT 문에 대해 NOAPPEND 힌트를 사용한 실행 계획입니다. PX 서버가 데이터를 Conventional Path로 적재합니다.
-- 4
INSERT /*+ PARALLEL(2) ENABLE_PARALLEL_DML NOAPPEND */
INTO t1
SELECT * FROM t2;
----------------------------------------------------------------------------
| Id | Operation | Name | TQ |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | | | |
| 1 | PX COORDINATOR | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | Q1,00 | P->S | QC (RAND) |
| 3 | LOAD TABLE CONVENTIONAL | T1 | Q1,00 | PCWP | | -- !
| 4 | PX BLOCK ITERATOR | | Q1,00 | PCWC | |
| 5 | TABLE ACCESS FULL | T2 | Q1,00 | PCWP | |
----------------------------------------------------------------------------
Note
-----
- Degree of Parallelism is 2 because of hint
- Direct Load disabled because noappend hint used
아쉽게도 Parallel Conventional Load는 Direct Load처럼 ORA-12838 에러가 발생하고, 타깃 테이블에 대해 TM Lock을 Exclusive 모드로 획득합니다.
-- 5-1
INSERT /*+ ENABLE_PARALLEL_DML PARALLEL(2) NOAPPEND */
INTO t1
SELECT * FROM t2;
1000000 행이 생성되었습니다.
-- 5-2
SELECT segment_name FROM user_segments WHERE segment_type = 'TEMPORARY';
선택된 레코드가 없습니다.
-- 5-3
SELECT * FROM t1;
ORA-12838: 병렬로 수정한 후 객체를 읽거나 수정할 수 없습니다r
-- 5-4
SELECT owner, name, mode_held
FROM dba_dml_locks
WHERE session_id = SYS_CONTEXT ('USERENV', 'SID');
OWNER NAME MODE_HELD
----- ---- ---------
TUNA T1 Exclusive
1개의 행이 선택되었습니다.
Parallel Conventional Load는 _disable_parallel_conventional_load 파라미터와 관련이 있습니다.
NAME VALUE DEFAULT_VALUE DESCRIPTION
----------------------------------- ----- ------------- -----------------------------------
_disable_parallel_conventional_load FALSE FALSE Disable parallel conventional loads
_disable_parallel_conventional_load 파라미터를 TRUE로 설정하면 Parallel Conventional Load가 동작하지 않습니다.
-- 6
ALTER SESSION SET "_disable_parallel_conventional_load" = TRUE;
INSERT /*+ ENABLE_PARALLEL_DML PARALLEL(2) NOAPPEND */
INTO t1
SELECT * FROM t2;
--------------------------------------------------------------------------
| Id | Operation | Name | TQ |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | | | |
| 1 | LOAD TABLE CONVENTIONAL | T1 | | | | -- !
| 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 | T2 | Q1,00 | PCWP | |
--------------------------------------------------------------------------
Note
-----
- Degree of Parallelism is 2 because of hint
- Direct Load disabled because noappend hint used
관련 링크