2011-07-01 2 views
5

내 C# .NET 응용 프로그램은 OracleBulkCopy를 사용하여 수백만 개의 레코드를 임시 테이블에 씁니다. 응용 프로그램에 메모리가 20000 개 이상있을 때마다 OracleBulkCopy를 호출하여 모든 배치를 단일 배치로 작성합니다 (배치 크기 = 0을 사용 중입니다). 처음에는 테이블이 비어 있고 전체 배치를 작성하는 데 2 ​​초 밖에 걸리지 않습니다. 이 과정에서 배치 작성 시간이 길어집니다. 2.000.000 레코드가 끝나면 각 호출에는 거의 25 초가 걸립니다. OracleBulkCopy의 기본 옵션을 사용하고 있습니다. 테이블이 40.000.000에 도달하면 몇 가지 테스트를 수행하면 20.000 개의 레코드를 작성하는 데 약 3 분이 소요됩니다.OracleBulkCopy 성능

각 통화마다 거의 일정한 시간을 유지하기 위해 어떤 권장 사항이 있는지 알고 싶습니다. 내가 뭐 잘못하고 있니?

+0

이 테이블에 삽입 트리거가 있습니까? – Nate

+1

아니요, 아무 것도 없습니다. 기본 키조차도 아닙니다. 로깅이 없도록 테이블이 설정됩니다. –

+0

"temp"테이블은 정확히 무엇을 의미합니까? 전역 임시 테이블? – DCookie

답변

3

이상한 행동처럼 보입니다. 대기중인 내용을보기 위해 삽입을 수행하는 데이터베이스 세션을 추적 했습니까?

ALTER SESSION SET timed_statistics=TRUE; 
ALTER SESSION SET max_dump_file_size=UNLIMITED; 
ALTER SESSION SET EVENTS '10046 trace name context forever, level 8'; 

100 회 중 100 회까지 추적 결과는 이러한 이상한 속도 저하의 경우를 알려줍니다.

+1

문제는 기본 키입니다. 테이블이 프라이 머리 키없이 생성되었다고 확신했습니다. 추적 파일을 사용하여 기본 키에서 수천 개의 순차적 읽기를 관찰했습니다. 이를 제거하면 배치 당 0.8 초의 거의 일정한 시간이 나타납니다. –

+0

당신이 그것을 발견했기 때문에 다행스럽게도 SQL Trace는 또 다른 문제점을 발견했습니다. 느린 경우 SQL Trace를 항상 시도해야합니다. –