Oracle: 대량의 데이터를 효율적으로 삽입하는 경험담

2584 단어
전제: insert 데이터를 만들기 전에 비생산 환경이라면 테이블의 인덱스와 제약을 제거하고 insert가 완성된 후에 인덱스와 제약을 만드십시오.
  insert into tab1 select * from tab2; commit;

이것은 가장 기초적인 insert 문장입니다. 우리는tab2표의 데이터인sert를tab1표에 저장합니다.경험에 따르면 천만 등급의 데이터는 1시간 안에 완성할 수 있다.그러나 이 방법이 발생하는arch는 매우 빠르기 때문에 압축 파일의 발생량을 주목하고 백업 소프트웨어를 제때에 시작하여arch 디렉터리가 폭발하지 않도록 해야 한다.
  alter table tab1 nologging; 
  insert /*+ append */ into tab1 select * from tab2; 
  commit; alter table tab1 logging;

이 방법은arch의 발생을 크게 감소시키고 어느 정도에 시간을 높일 수 있으며 경험에 따라 천만급의 데이터는 45분 안에 완성할 수 있다.단, 이 방법은 단일 프로세스의 직렬 방식에 적합합니다. 여러 프로세스가 동시에 실행될 때, 나중에 시작하는 프로세스는 enqueue가 기다릴 것입니다.이 방법은 데이터guard에서 절대 사용할 수 없습니다. 그러나 데이터베이스가 force logging에 이미 설치되어 있다면 문제없습니다.
  insert into tab1 select /*+ parallel */ * from tab2; commit;

select 이후의 문장이 전체 표 스캔인 경우 우리는parallel의hint를 추가하여 병발을 높일 수 있다. 여기서 주의해야 할 것은 최대 병발도가 초기화된 파라미터parallelmax_서버스의 제한, 병렬 프로세스는 v$pxsession 보기 또는 ps -ef | grep ora보기
  alter session enable parallel dml; 
  insert /*+ parallel */ into tab1 select * from tab2; commit;

방법2와 반대로 병발된 insert는 방법2의 어느 효율이 더 높은지 비교하지 않았습니다(우연히 방법2로 추정됨). 테스트한 분들은 보충을 환영합니다.
  insert into tab1 select * from tab2 partition (p1); 
  insert into tab1 select * from tab2 partition (p2); 
  insert into tab1 select * from tab2 partition (p3); 
  insert into tab1 select * from tab2 partition (p4);

섹션표는tab1을 이용하여 여러 프로세스를 병행할 수 있는 insert입니다. 섹션이 많을수록 시작할 수 있는 프로세스가 많습니다.insert 2.6억 줄에 기록된 표, 8개 구역, 8개 프로세스를 시험해 본 적이 있습니다. 만약 방법 2를 사용한다면 단일 프로세스가 완성되는 데 40분이 걸릴 수 있지만, 8개 구역, 8개 프로세스가 있고, 후발 프로세스가 enqueue가 있기 때문에 40분이 걸립니다.×8;그러나 방법 5를 사용하면 단일 프로세스는 110분이 걸리지만 병렬 프로세스가 실행되기 때문에 총 110분이 걸린다.
  DECLARE TYPE dtarray IS TABLE OF VARCHAR2(20) 
  INDEX BY BINARY_INTEGER; 
  v_col1 dtarray; v_col2 dtarray; v_col3 dtarray; 
  BEGIN SELECT col1, col2, col3 BULK COLLECT INTO v_col1, v_col2, v_col3 
  FROM tab2; 
  FORALL i IN 1 .. v_col1.COUNT insert into tab1 
  WHERE tab1.col1 = v_col1; 
  END;

대량 바인딩(bulk binding) 방식을 사용합니다.연결된 변수의 sql 문장을 순환할 때 PL/SQL과 SQL 엔진 (engines) 에서 대량의 상하문 전환 (context switches) 이 발생합니다.bulkbinding을 사용하면 데이터를 대량으로plsql 엔진에서 sql 엔진으로 전송하여 상하문 전환 과정을 줄이고 효율을 높일 수 있다.이 방법은 온라인 처리에 비교적 적합하며, 정지할 필요가 없다.
  sqlplus -s user/pwd 
  

   copy , insert into 。 copycommit arrarysize commit , 10000 commit 。

좋은 웹페이지 즐겨찾기