Oracle: 대량의 데이터를 효율적으로 삽입하는 경험담
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 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.