table A 의 CLOB 안에 내용은 아래와 같은 구조의 XML 데이타가 Clob 컬럼에 INSERT 되어있습니다.
(table A 의 ROW수는 4300개이며 CLOB 컬럼(CLOB_COL)의 사이즈는 각각 6메가바이트 정도입니다. )
생산정보와 판매정보의 엘리먼트 수가 상당히 많습니다.
<백화점>
<기본정보>
<상품ID>010101</상품ID>
<상품명>가방</상품명>
</기본정보>
<생산정보>
<생산정보키 생산키="001001">
<생산제목>
<![CDATA[ 가나다라마바사 ]]>
</생산제목>
<생산내용>
<![CDATA[ 가나다라마바사 ]]>
</생산내용>
</생산정보키>
</생산정보>
<판매정보>
<판매정보키 판매키="001001">
<판매제목>
<![CDATA[ 가나다라마바사 ]]>
</판매제목>
<판매내용>
<![CDATA[ 가나다라마바사 ]]>
</판매내용>
</판매정보키>
</판매정보>
</백화점>
위에 테이블 TABLE_A 에 대하여 TABLE_B 테이블에 XML 파싱을 하여 데이타를 INSERT 하려구합니다.
(오라클 11g 사용 XMLTYPE 4000byte 이상 지원)
INSERT INTO TABLE TABLE_B (COL_A, COL_B, COL_C, COL_D, COL_E, COL_F)
SELECT EXTRACTVALUE(VALUE(p),'//상품ID') COL_A
, EXTRACTVALUE(VALUE(p),'//상품명' ) COL_B
, EXTRACT(VALUE(a), '//@*' ).GETSTRINGVAL() COL_C
, EXTRACTVALUE(VALUE(a),'//생산제목' ) COL_D
, EXTRACTVALUE(VALUE(a),'//생산내용' ).GETCLOBVAL() COL_E
, 1 as COL_F
FROM TABLE_A
, TABLE(XMLSEQUENCE(EXTRACT(XMLTYPE(TABLE_A.CLOB_COL), '/백화점/기본정보'))) p
, TABLE(XMLSEQUENCE(EXTRACT(XMLTYPE(TABLE_A.CLOB_COL), '/백화점/생산정보/생산정보키'))) a
UNION ALL
SELECT EXTRACTVALUE(VALUE(p),'//상품ID') COL_A
, EXTRACTVALUE(VALUE(p),'//상품명' ) COL_B
, EXTRACT(VALUE(e), '//@*' ).GETSTRINGVAL() COL_C
, EXTRACTVALUE(VALUE(e),'//판매제목' ) COL_D
, EXTRACT(VALUE(e),'//판매내용' ).GETCLOBVAL() COL_E
, 2 as COL_F
FROM TABLE_A
, TABLE(XMLSEQUENCE(EXTRACT(XMLTYPE(TABLE_A.CLOB_COL), '/백화점/기본정보'))) p
, TABLE(XMLSEQUENCE(EXTRACT(XMLTYPE(TABLE_A.CLOB_COL), '/백화점/판매정보/판매정보키'))) e
select 쿼리의 row합계는 약 21만건이며
insert select 실행시 600초 정도 소요됩니다.
insert select 실행 속도를 최대한 줄여야하는 상황입니다.
append 및 PARALLEL 힌트 사용은 적용해보았으나 별로 효과를 보지못하여
고수님들께 질문드립니다...
감사합니다. |