2012-01-26 3 views
0

다른 원격 데이터베이스의 데이터를 자체 데이터베이스에로드해야합니다. WITH 문을 사용하여 하나의 "복잡한"쿼리를 작성합니다. 약 1 천 8 백만 행의 데이터입니다.Oracle : 테이블에 큰 데이터 세트 삽입

삽입을 수행하는 가장 효율적인 방법은 무엇입니까?

또는 어떤 다른 방법이 INTO INSERT를 사용하여 하나

  • 하나를 삽입 커서를 사용하고 계십니까?

  • +0

    몇 가지 질문 (I는 한 번에 18m 아마 컴퓨터에 과부하 것이라고 생각). 이것은 일회성 운동인가 정기적인가? 로드를 실행하기위한 시간 창은 무엇입니까? 원본 및 대상 데이터베이스의 대기 시간은 얼마나됩니까? 데이터베이스 간의 연결은 얼마나 신뢰할 수 있습니까? 원본 데이터베이스의 데이터가 정적 (아카이브) 또는 동적 (운영 체제)입니까? 프로세스가 중간에 실패하면 (예를 들어, 네트워크 연결이 끊어지는 경우) 대상 데이터베이스로 무엇을 보내고 싶습니까? – APC

    답변

    4

    가장 빠른 방법은 단일 SQL 문을 사용하는 것입니다. 다음으로 가장 효율적인 방법은 BULK COLLECT 작업을 수행하는 커서를 사용하여 SQL과 PL/SQL 엔진 간의 컨텍스트 이동을 최소화하는 것입니다. 가장 효율적인 방법은 커서를 사용하여 행 단위로 데이터를 처리하는 것입니다.

    +0

    감사합니다. BULK COLLECT가 정말 도움이됩니다.^_^ – Ianthe

    0

    1800 만 개의 행은 단일 삽입 시나리오에 상당히 많은 롤백이 필요합니다. 루프에 대한 커서는 훨씬 느리지 만 모든 x 행을 커밋 할 수 있습니다.

    개인적으로 오래된 학교에 가서 파일을 덤프하고 sqlldr 또는 데이터 펌프를 통해로드합니다.

    +0

    모든 * x * 행을 커밋하면 ABEND 후에로드 프로세스를 다시 시작할 때 더 많은 작업이 수행됩니다. 또한 더 넓은 시선에 부분적인 하중을 가하는 것이 의미가 없을 수도있는 시나리오가 있습니다. 그러나 나는 1800 만 행이 단일 거래를 추진하는데 많은 것을 동의한다. – APC

    +0

    또한 1800 만개의 삽입물은 생각할 수있는만큼 롤백을 생성하지 않습니다. 기본적으로 1800 만 개의 ROWID와 일부 메타 데이터입니다. DBA에게 UNDO 테이블 스페이스의 크기를 알맞게 맞추는 것입니다. – APC

    1

    저스틴 (Justin)이 쓴 것처럼 가장 효율적인 방법은 단일 SQL 문 (insert into ... select ...)을 사용하는 것입니다. 또한 당신이 direct-path insert

    0

    을 이용할 수 있습니다 당신은 Data Synchronisation Studio를 사용하여 한 번에 1 백만을 위해 SELECT 문을 변경할 수

    관련 문제