2014-11-03 2 views
1

특정 배포 매개 변수를 준수하는 6,800,000 개의 레코드가있는 CSV 파일을 생성하고 Oracle의 SQL * Loader를 사용하여 테이블을 채우는 Java 프로그램을 작성하고 있습니다.오라클의 SQL * Loader를 조정하는 방법은 무엇입니까?

다른 크기의 레코드 (50,000 및 500.000)를 사용하여 프로그램을 테스트하고 있습니다. CSV 파일 생성 자체가 매우 빠르며 동시성을 사용하여 이러한 레코드를 만들어 파일에 삽입하는 데 수 밀리 초가 소요됩니다.

한편, 레코드를 삽입하는 데 너무 오래 걸립니다. SQL * Loader에 의해 생성 된 로그 파일을 읽는 경우 테이블에 50,000 개의 레코드를 채우고 00 : 07 : 58.83 분에 500,000을 채우려면 00 : 00 : 32.90 초가 걸립니다.

내가 봤던 SQL * Loader 벤치 마크는 2 분 이내에 2 백만 행과 같이 훨씬 더 나은 성능을 보여 주었다. 나는 시간을 개선하기 위해 this tutorial을 따라 갔지만 거의 변경되지 않았습니다. 여기에 분명히 잘못된 것이 있지만, 나는 무엇을 모르겠습니다. 내가 PARALLEL = TRUE를 사용하여 시도했지만, 나는 (표 MY_TABLE이 지수는 그것을 바탕으로 정의하고있다)을 ORA-26002 오류가 발생합니다 :

OPTIONS (SILENT=ALL, DIRECT=TRUE, ERRORS=50, COLUMNARRAYROWS=50000, STREAMSIZE=500000) 
UNRECOVERABLE LOAD DATA 
APPEND 
INTO TABLE MY_TABLE 
FIELDS TERMINATED BY "," 
TRAILING NULLCOLS 
... 

또 다른 중요한 정보 :

여기 내 제어 파일입니다. 불행히도 skip_index_maintenance로 실행하면 색인을 사용할 수 없게됩니다.

내가 뭘 잘못하고 있니?


업데이트

곧 프로그램 (초 미만)를 실행 한 후, 모든 행이 이미 데이터베이스에 존재하는 것으로 나타났습니다. 그러나 SQL * Loader는 여전히 사용 중이며 32-45 초 후에 만 ​​완료됩니다.

무엇을 할 수 있습니까?

답변

1

하나의 생각은 외부 테이블을 만들고 csv 파일에 이름을 설정하는 것입니다. 그런 다음 파일을 만든 후에 Oracle에서 SQL 스크립트를 실행하여 데이터를 직접 처리 할 수 ​​있습니다.

또는보고 다음 (복사에는 인덱스가 오라클 대상을로드 병렬 대량로드 옵션을 사용하는 경우이 문제가 발생합니다 here :

에서. 오라클의 한계.

이 문제는 다음 중 하나를 해결하려면

·

정상으로 목표 부하 옵션을 변경합니다.

· 관계형 연결 브라우저에서 병렬 모드 활성화 옵션을 비활성화합니다.

로드하기 전에 인덱스를 삭제하십시오.

· 또는 떨어 뜨릴 인덱스를 다시 ... 드롭 인덱스 및 키 제약

+0

좋은 하나를 만들기 위해 사전 및 사후 세션 SQL을 만들 내가 기존의 삽입과 노력 할게요, 옵션을 선택하지 않습니다 .. – Tarek

+0

전통적인 경로는 더 많은 시간이 걸렸습니다 ... 문제는 테이블이나 데이터베이스에있는 것 같아요. DBA에게 살펴 보도록하겠습니다. – Tarek

관련 문제