database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40561 게시물 읽기
No. 40561
대용량 xml구조 데이타 insert select
작성자
json
작성일
2014-08-22 16:03ⓒ
2014-08-22 16:06ⓜ
조회수
9,695


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 힌트 사용은 적용해보았으나 별로 효과를 보지못하여
고수님들께 질문드립니다...

감사합니다.

이 글에 대한 댓글이 총 1건 있습니다.

CREATE or REPLACE PROCEDURE PROC_CLOB( Arg_DATA   IN CHAR)

  IS
  BEGIN
        INSERT INTO TABLE
        ( A   )
        VALUES ( Arg_DATA );

END;
 

CALL  PROC_CLOB('" & GDATA & "')
 

박재덕(jdpark)님이 2014-10-13 16:15에 작성한 댓글입니다.
이 댓글은 2014-10-13 16:16에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
40565테이블 삭제 trigger [1]
권기혁
2014-09-01
7858
40564SQL 데이터 조회시 질문이있습니다... [1]
신동열
2014-08-28
7716
40563쿼리 질문 드립니다. [1]
야간비행
2014-08-26
7847
40561대용량 xml구조 데이타 insert select [1]
json
2014-08-22
9695
40560기간내 해당하는 데이타 추출하기 [1]
너구리
2014-08-22
8647
40559프로시져 속도 향상 문의 드립니다. [5]
야간비행
2014-08-20
9013
40558합격자 선발 SQL 작성 방법? [4]
김기석
2014-08-18
8556
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다