본문 바로가기

데이터 사이언스 DataScience/Data Base 데이터베이스

[Oracle] LOB 테이블에 Parallel DML 적용이 안된다

1. 문제상황

테이블 압축 효율 테스트를 위해 LOB 컬럼이 포함된 테이블에 INSERT INTO SELECT로 데이터를 넣는데,

PARALLEL이 적용되지 않았다.

 

GV$SESSION에서 4개의 Slave 세션을 확인할 수 있었지만

Active Transaction은 1개만 확인할 수 있었다.

 

즉, DML(Insert)이 Parallel로 실행되고 있지 않았다.

 

* 예시 SQL

-- 1. 세션 DML, QUERY를 PARALLEL 4로 수행
ALTER SESSION FORCE PARALLEL DML PARALLEL 4;
ALTER SESSION FORCE PARALLEL QUERY PARALLEL 4;

-- 2. Insert Select 실행
INSERT /*+ APPEND FULL(A) PARALLEL(A 4) */ INTO TABLE_A AS A
SELECT /*+ FULL(B) PARALLEL(B 4) */ *
FROM TABLE_B AS B
;

 

2. 해결방법

정답은 오라클 공식자료에 있었다.

 

12c 이전 버전에서는, 파티션 테이블이 아닌 LOB 컬럼 포함 테이블에선 Parallel DML이 불가하다.

Until 12c, running parallel DML on tables with LOB columns required that table to be partitioned.

 

해당 DB는 11g 버전이었고, 19c 버전에서 동일한 SQL로 Parallel DML이 발생하는 것을 확인했다.

즉, 12c 이후 버전에서는 파티션 테이블이 아닌 LOB 컬럼 포함 테이블도 Parallel Insert가 가능하다.

 

단, 12c 이전 버전에서도 Insert를 하는 대상 테이블이 파티션화가 되어있다면,

데이터의 원천 테이블은 논파티션 테이블이어도 상관없다. 

 

Source 테이블이 논파티션 테이블이어도 Select는 Parallel로 가능하고, 

Target 테이블만 파티션 테이블이면 Insert가 Parallel로 가능하기 때문이다.

 

 

출처 : 

https://blogs.oracle.com/datawarehousing/post/parallel-dml-on-tables-with-lob-columns

 

 

반응형