소소한 일상에서 책읽기 중

PARALLEL DML 사용 방법 본문

DB까다롭다

PARALLEL DML 사용 방법

다솜여우 2012. 3. 16. 10:50
아래 문서를 찾아보세요.

No. 11453

PARALLEL DML 사용 방법
======================

Purpose


Oracle8 version부터는 DML 문장에도 Parallel 기능을 사용할 수 있다.
그 기능을 사용하는 방법을 확인하고 적용해 보자.

Explanation



Oracle8에서 대용량의 Database를 지원하기 위한 방법의 하나로
Parallel DML이 있다. Oracle8은 Oracle7의 Parallel Query Option과
비슷한 구조로 Parallel DML을 실행한다.
Parallel하게 조회를 하면 테이블에 대한 부분적인 scan을 하는
동시에 여러 개의 parallel server process 가 블럭 범위에 의해
동적으로 나누어진다. Parallel DML도 DML 작업을 parallel 하게
여러 개의 process를 동시에 실행하여 처리할 수 있는 방법으로
batch job에서 실행하는 partitioned table이나 large table의 경우
performance를 크게 향상시킬 수 있는 방법이다.

1. 실행 방법

먼저 다음의 parameter 를 init<SID>.ora file에 setting해 준다.

PARALLEL_MAX_SERVERS - Parallel server process의 최대 개수
(default 5)
PARALLEL_MIN_SERVERS - Oracle startup 시 뜨는 parallel process 개수
(default 0)

Parallel DML을 사용을 위해서는 먼저 해당 세션에서 parallel DML을
enable 시키는 명령문을 실행해야 한다.

alter session enable parallel dml; -> enabling parallel dml
alter session disable parallel dml; -> disabling parallel dml

parallel dml 을 enable하거나 disable 하기 전에는 반드시 commit
이나 rollback 을 해 주어야 한다.

SQL> insert into dept values (50,'abc','abc');
1 row created.

SQL> alter session enable parallel dml;
ERROR:
ORA-12841: Cannot alter the session parallel DML state within a
transaction

SQL> commit;
SQL> alter session enable parallel dml;
Session altered.
SQL> update /*+ parallel(testdml,10) */ testdml set c = '2';

serial update를 한 후에 같은 object를 다시 parallel하게 udpate
할 수는 없다. Parallel dml은 transaction의 첫번째 DML이 되어야 한다.

SQL> alter session enable parallel dml;
Session altered.
SQL> update testdml set c = '1';
999998 rows updated.
SQL> update /*+ parallel(testdml,10) */ testdml set c = '2';
update /*+ parallel(testdml,10) */ testdml set c = '2'
*
ERROR at line 1:
ORA-12839: cannot modify an object in parallel after modifying it

default 는 disable이므로 parallel dml을 사용하기 전에 반드시
enabling 해주어야 한다. Disable parallel dml mode의 세션에서는
parallel dml을 실행하여도 에러 없이 serial하게 실행된다.

2. Space 의 관리

(1) Create table .. as select, create index 작업의 저장 영역

Parallel 하게 table 이나 index를 생성하는 경우 create 명령의
storage 절의 initial 값으로 temporary segment를 생성한다.
Initial 값이 5M이고 parallel degree 를 10으로 설정하여 table을
생성하는 경우는 5M 씩 10개의 temporary segment가 만들어지면서
data를 저장한다. 그리고 Parallel coordinator 가 temporary
segment를 병합한다.

(2) Temporary segment 의 free space 관리

Data의 loading 작업이 끝난 후에 각 temporary segment에서
사용되지 않은 free space를 가진 extent가 tablespace level에서
설정한 minimum extent 값보다 크면 parallel coordinator 가
모든 temporary segment를 병합할 때 사용하지 않은 영역은 잘라낸다.
잘려진 영역은 datafile의 free space로 돌려지며 다른 object에 의해
사용될 수 있다. 그러나 연속된 영역이 아니므로 하나의 큰 segment로
합쳐질 수 없다. (external fragmentation)
위의 경우에서 free space를 가진 extent가 minimum extent 값보다
작으면 parallel coordinator 가 모든 temporary segment를 병합할 때
사용하지 않은 영역도 포함시킨다. 이 부분은 후에 data가 insert될 때
사용된다. (internal fragmentation)

3. 제한 사항

(1) UPDATE 와 DELETE 문은 non-partitioned table에서는 parallel
하게 실행되지 않는다.

(2) Initial parameter Row_locking = intend 가 지정된 경우는
Parallel insert, update, delete가 실행되지 않는다.

(3) Trigger가 걸린 table에 대해서는 parallel dml을 실행할 수 없다.
trigger가 걸린 table에 사용할 때에는 trigger를 disable해야 한다.

(4) 같은 transaction 내에서 parallel DML 문장에 의해 update된
table에 대해 다시 dml 문을 실행할 수는 없다. Parallel DML 문장
이후에는 반드시 commit을 해야 한다.

(5) self-referential integrity, delete cascade 등에서는 parallel
DML을 사용할 수 없다.

(6) Parallel DML은 object , LOB column 을 가진 table에서는
사용할 수 없다.

(7) Distributed transaction 에서는 parallel DML을 사용할 수 없다.

(8) Clustered table에서는 parallel DML을 사용할 수 없다.


출처 : https://kr.forums.oracle.com/forums/thread.jspa?threadID=610175