NO PARALLEL DML

9
- Question 대대대 대대대대 대대 DML 대대대 ? Discussion - Answer PARALLEL DML 대 대대대대 ?

description

USE LOOP DML AND MONITORING INSTEAD OF PARALLE DML

Transcript of NO PARALLEL DML

Page 1: NO PARALLEL DML

-Question

대용량 테이블에 대한 DML 처리는 ?

Discussion

-Answer

PARALLEL DML 을 사용한다 ?

Page 2: NO PARALLEL DML

-Question more

Trigger 가 걸린 온라인 대용량 테이블에 대한 DML 처리는 ?

Discussion

-Answer

한 건씩 한다 ?

Page 3: NO PARALLEL DML

대부분의 대용량 테이블에 대한 빠른 DML 처리는 PARALLEL 설정을 사용한다 .

하지만 해당 테이블에 TRIGGER 가 걸려있거나 ONLINE 사용중인 테이블은 이에대한 부담이 크다 .

이런 상황인 경우에 SQL 을 일일이 만들어서 특정 범위를 반복적으로 DML 을 수행하는경우가 있는데 작업자는 무한적 앉아서 엔터돌이를 해야 하는 걸까 .

좀 더 생각을 한 사람은 특정범위를 기준으로 PL/SQL 을 통해 한 번에 작업을 한다 .

그러나 . 문제는 현재 이 작업이 어느 정도 수행이 되었는지를 모르기 때문에재 작업의 부담도 크고 매우 답답함을 느낀다 .

다음의 내용은 이런 경우에 활용 가능한 TIP 이다 .

Discussion

Page 4: NO PARALLEL DML

1. 한번에 대용량 처리가 불가능하다면 처리하고자 하는 데이터의 기준범위를 설정한다 .

5 천만건을 UPDATE 해야하는데 해당 테이블에 트리거가 걸려있다 .테스트를 해보니 대략 1 만건 정도를 한번에 처리하는 것은 큰 부담이 없다고 판단되었다 .

구조설계

2. FOR LOOP 를 통해 1 만 * ? = 5 천만을 LOOP 할 수 있는 구조를 만든다

i * j = 5000 만

Page 5: NO PARALLEL DML

PACKAGE 를 활용

SELECT SID, MODULE, ACTION FROM V$SESSION WHERE SID = ?

PACKAGE 의 인수가 V$SESSION 에 나타난다

Page 6: NO PARALLEL DML

DML 작성

EX. UPDATABLE JOIN 활용의 예

UPDATE 대상범위를 활용 하기 위해 “ B”집합에

1. “ROWNUM” 을 활용한 RNUM 속성과2. A 테이블 ROWID 를 RID 속성으로

미리 만들어 둔다

i, j 를 활용하여 업데이트 범위를 “ 1 만”건 단위로 균일하게 처리할 수 있도록 조건을 추가하고 작업이 끝나면 j 를 증가시켜 다음 범위의 시작점을 초기화 시킨다

Page 7: NO PARALLEL DML

예제DECLARE i integer; j integer;

BEGIN j := 0;

for i in 1..5000 loop DBMS_APPLICATION_INFO.SET_MODULE(' 업데이트 진행중 : CUSTOMER', 'NOW : ' || (j+1));

UPDATE ( SELECT A.* , DECODE(B.MNFRM_RTRN_IND_CD,'P','C',B.MNFRM_RTRN_IND_CD) MNFRM_RTRN_IND_CD_NEW, DECODE(B.BTRY_RTRN_IND_CD,'P','C',B.BTRY_RTRN_IND_CD) BTRY_RTRN_IND_CD_NEW, DECODE(B.CHREQP_RTRN_IND_CD,'P','C',B.CHREQP_RTRN_IND_CD) CHREQP_RTRN_IND_CD_NEW FROM CUSTOMER A, CUSTOMER_HIST B WHERE A.ROWID = B.RID AND RNUM BETWEEN (j + 1) AND (10000 * i) ) X SET MNFRM_RTRN_IND_CD=MNFRM_RTRN_IND_CD_NEW, BTRY_RTRN_IND_CD=BTRY_RTRN_IND_CD_NEW;

j := 10000 * i;

COMMIT; end loop;end;/

SQL> 위 BLOCK 을 수행하기 전에 SID 를 먼저 확인한 후 작업을 진행한다

Page 8: NO PARALLEL DML

MONITORING

SQL> SELECT SID, MODULE, ACTION FROM V$SESSION WHERE SID = ?

SID MODULE ACTION---- --------------------------------- ----------------18 업데이트 진행중 : CUSTOMER NOW : 40000

1 row selected.

SQL>

수행결과

Page 9: NO PARALLEL DML

TIP2

자신의 SID 를 모르는 경우

작업도구에서 SID 를 알 수 없으면 .. 다음의 SQL 을 활용한다

SQL> SELECT SID FROM V$SESSION WHERE AUDSID = USERENV('SESSIONID') ;

SID---18

1 row selected.

SQL>

단 , DBA 를 통해 V$SESSION 에 대한 조회 권한과 관련 PACKAGE 수행권한을 획득해야 한다