[Oracle] 데이터 이행 - Direct load insert

·2025년 9월 9일
0

오라클 관리

목록 보기
122/163

💡 데이터 이행 방법 3가지

  1. Direct load insert
    : 서브쿼리를 사용한 insert 문
  2. SQL*loader
    : csv 나 text 파일을 데이터베이스에 이행
  3. export / import
    : 테이블 또는 테이블스페이스를 통째로 이행

💡 서브쿼리를 사용한 insert문의 속도를 높이는 방법

Direct load insert: high water mark 위에 데이터를 입력하는 것


💡 HWM(High Water Mark)란?

포맷된 디스크와 포맷되지 않은 디스크의 경계선

direct load insert를 하게 되면 HWM 위로 INSERT를 하게 되어서 입력 속도가 빨라짐


[실습1] Direct load insert 실습

create  table emp2
as
 select *
  from emp;
  
delete from emp2;
commit;

-- 아래의 insert 문은 HWM 아래에 입력하는 INSERT 문입니다. 
insert into  emp2
select *
 from emp;
 
SELECT * from emp2; 

delete from emp2;
commit;

--- HWM 위로 데이터를 입력합니다.
insert /*+ append */ into  emp2
select *
 from emp;

select * from emp2;

-- commit을 해줘야 HWM이 위로 올라가서 select문을 읽을 수 있게됨

commit;을 하면 select 문이 조회가 됨


문제1. dept 테이블을 가지고 dept_backup 테이블을 생성하시오

create  table  dept_backup
as
 select * from dept;

문제2. dept_backup 테이블을 모두 delete 하고 commit 하시오

delete from dept_backup;
commit;

문제3. dept 테이블의 데이터를 dept_backup 테이블에 모두 insert 하는데 HWM 위로 입력하게 하시오

insert /*+ append */ into dept_backup
select * from dept;

-- 조회 안됨
select * from dept_backup;

commit;

-- commit 후 조회 됨
select * from dept_backup;

💡 HWM 위로 데이터를 입력할 때, 병렬로 입력하는 명령어

truncate table dept_backup;

alter session enable parallel dml;

insert /*+ parallel(dept_backup,4) */ into dept_backup
 select *
  from dept;

select * from dept_backup;

commit;

select * from dept_backup;

🔸 문제4. mcustsum 을 이용해서 direct load insert 를 했을 때와 안했을 때의 속도 차이를 set timing on 을 걸어놓고 테스트 하고 테스트 결과를 올리시오

  1. HWM 아래로 입력했을 때 속도
  2. HWM 위로 입력했을 때 속도
  3. HWM 위로 병렬도를 4로 입력했을 때 속도
-- mcustsum 테이블 만드는 쿼리문

drop table mcustsum purge;

create table mcustsum as
select rownum custno,
       '2025' || lpad(ceil(rownum / 100000), 2, '0') salemm,
       decode(mod(rownum, 12), 1, 'A', 'B') salegb,
       round(dbms_random.value(1000, 100000), -2) saleamt
from dual
connect by level <= 1200000;

1. HWM 아래로 입력했을 때 속도

set timing on

create table mcustsum2
as
 select *
  from mcustsum;
  
delete from mcustsum2;
commit;

insert into mcustsum2
select *
 from mcustsum;
 
select * from mcustsum2;


2. HWM 위로 입력했을 때 속도

delete from mcustsum2;
commit;

insert /*+ append */ into mcustsum2
select *
 from mcustsum;

commit;

select * from mcustsum2;


3. HWM 위로 병렬도를 4로 입력했을 때 속도

truncate table mcustsum2;

alter session enable parallel dml;

insert /*+ parallel(mcustsum2, 4) */ into mcustsum2
 select *
  from mcustsum;

commit;

select * from mcustsum2;


[복습] 데이터 이행의 3가지 방법

  1. pump를 이용한 데이터 이행 (가장 많이 사용) → 비교적 빨리 수행됨
     
  2. 서브쿼리를 사용한 insert (direct load insert : HWM 위로 데이터 입력) → 6개월 ~ 1년 프로젝트
    AS-IS —> TO-BE 이행 시 개인정보 데이터를 암호화, 컬럼 추가·삭제 등의 변화, 컬럼 길이의 변화

     
  3. CSV 파일을 테이블에 입력(direct path load)
    --> 은행과 은행간의 계좌 이체 내역을 공유할때 엑셀로 주고 받는 경우가 많음

[복습2] high water mark 위에 데이터를 입력하는 힌트 2가지

  1. append 힌트 --> 하나의 프로세서가 insert를 수행
  2. parallel 힌트 --> 여러 개의 프로세서가 insert를 수행
 insert  /*+  parallel(sales_new, 병렬도 )  */  into  sales_new
 select  /*+ parallel(sales,병렬도) */
    from  sales;

0개의 댓글