DATOR


NTILE 함수를 이용한 분산 SQL


마이그레이션 프로젝트를 진행하면서 겪어던 문제와 해결책이다.

 

소스테이블은 4가지 서브시스템 구분으로 나뉘어져 있고,
각 시스템별로 테이블의 갯수가 다르다.

 

소스테이블들은 일괄적으로 마이그레이션 테스트 서버로 IMPORT 되는데,
나의 일은 소스테이블들이 테스트서버로 제대로 들어왔는지,
어떤 변화가 있었는지를 체크하기 위해 테스트때 마다 각 소스테이블들의
ROW수를 체크하는 것이었다.

 

소스테이블의 목록과 각 소스테이블의 사이즈로 유추해논 PARALLEL DOP는 테이블로 저장되어 있다.

여기서 문제점은 시스템별로 테이블 ROW를 체크할때 DOP가 몰리지 않게 분산시키는 것이다.

그래서 해결책은 NTILE을 이용하여 적절한 분산을 할수 있었다.
다음은 FUNCTION의 일부분이다.

 

FOR TAB_LIST IN (SELECT *
          FROM (SELECT SYSTEM
                               ,OWNER
                               ,TAB
                               ,DOP
                               ,NTILE(DECODE( SYSTEM,'시스템구분A',2,'시스템구분B',3,'시스템구분C',2,'시스템구분D',4,1))

                                            OVER(PARTITION BY SYSTEM, DOP ORDER BY TAB) NNUM
                      FROM 로우카운트테이블
                    WHERE SYSTEM = I_SYSTEM
                     ORDER BY DECODE(MOD(I_NNUM,2),0,DOP,NULL) DESC,

                                          DECODE(MOD(I_NNUM,2),1,DOP,NULL) ASC )
         WHERE NNUM = I_NNUM)LOOP

 

V_SQL := 'SELECT /*+ PARALLEL(TAB '||TAB_LIST.DOP||') */ COUNT(*) 

                     FROM '||TAB_LIST.OWNER||'.'||TAB_LIST.TAB||' TAB';                              
           EXECUTE IMMEDIATE V_SQL INTO V_CNT;
END LOOP;

 

설명

 
위 FUNCTION은 프로그램 PARALLEL로 I_SYSTEM, I_NNUM 을 입력받아
동시에 수행되는데 동시에 수행될때 PARALLEL DOP가 몰리지 않는것이 관건이다.

 

NTILE 안에 DECODE문을 사용하여 시스템 구분별로 나눌 등분을 지정하고,
OVER 안에 PARTITION문을 이용하여 시스템, DOP 별로 고루 분배가 되게 한다.


ORDER BY 구문안에 DECODE 문은 외부 에서 입력 받는 값(홀,짝)에 따라 순서를 달리 함으로써

같은 DOP가 동시에 실행되지 않게 해준다.

Tag :

Leave Comments