DATOR


CLOB 컬럼 가공 속도 향상 사례 PROJECT vs DA


데이터 이행 프로젝트를 수행하고 있는데 간단한 아이디어로 문제를 해결한 사례이다.

 

ASIS 테이블은 제목(TITLE)과 내용(CONT)이 각각 VARCHAR2와 CLOB로 되어 있는데,

TOBE 테이블은 내용만 CLOB으로 되어 있어서 제목과 내용을 붙여서 TOBE 테이블에 INSERT하는 작업으로

간단히 축약한 SQL은 다음과 같으며 2200초 정도 수행되었다.

 

INSERT /*+ APPEND */ TOBE_BBS SELECT BBS_NO, TITLE||' '||CONT FROM ASIS_BBS;  -- 2200초 수행

 

 

그런데, 아래와 같이 CONT 컬럼을 가공(CONCATENATE)하지 않으면 260초만에 완료된다.

 

INSERT /*+ APPEND */ TOBE_BBS SELECT BBS_NO, CONT FROM ASIS_BBS; -- 260초 수행

 

 

위와 같은 차이의 원인은 CLOB에 대한 가공으로 생각되며 CLOB 컬럼에 REPLACE, SUBSTR 등의 함수를 붙여도 유사한 성능 저하를 경험하게 된다.

 

이 현상은 오라클의 내부적인 처리 문제가 아닌가 예측하면서,  이런 저런 곳에서 해결책을 찾아 보았지만 특별한 방법을 찾지 못하던 중,

CLOB 컬럼 이라 하더라도 대부분의 데이터는 4000바이트 이하라는 점,

LENGTH 함수는 빠르게 수행된다는 점에서 아이디어가 떠올라 다음과 같이 해결하게 되었다.

 

아래와 같이  4000바이트 이하인 경우와 초과하는 경우로 나누어 수행하면 어느 정도의 성능향상을 볼 수 있다.

 (단, 성능 향상의 전제 조건은 CLOB 컬럼이라 하더라도 4000 바이트 이하인 ROW가 많아야 한다.)

 

INSERT /*+ APPEND */ ALL

  WHEN LENGTHB(TITLE) + LENGTHB(CONT) <= 4000 THEN INTO TOBE_BBS VALUES (BBS_NO, TITLE||' '||TO_CHAR(CONT) ) 

  WHEN LENGTHB(TITLE) + LENGTHB(CONT)  >  4000  THEN INTO TOBE_BBS VALUES (BBS_NO, TITLE||' '||CONT)

SELECT * FROM ASIS_BBS;  -- 400초

 

결과를 보면 260초 까지 줄지는 않았지만, 2200초에서 400초 정도로 개선됨을 알 수 있다.(물론 4000 바이트 이하 데이터의 비율에 따라 효과는 달라진다.)

 

워낙 심플한 방법이니 더 이상 설명을 추가할 필요도 없어 보이며, 다음과 같이 분석용 SQL에도 적용할 수 있다.

 

SELECT SUM(DECODE(INSTR(GDAS_CONT,'상품'),0,0,1)) FROM TOBE_BBS;  -- 160초

 

SELECT SUM(CASE WHEN LENGTHB(GDAS_CONT) <= 4000 THEN DECODE(INSTR(TO_CHAR(GDAS_CONT),'상품'),0,0,1)
                ELSE DECODE(INSTR(GDAS_CONT,'상품'),0,0,1) END) FROM TOBE_BBS;  -- 100초

 

 

 

 

TAG

Leave Comments