2017-10-23 9 views
0

엄청난 양의 데이터를 테이블에 업로드하기 위해 SQL * Loader 스크립트 작업 중입니다.반복되는 레코드를 건너 뛰는 방법은 무엇입니까?

스크립트는 다음과 같은 방식으로 작동합니다. FTP 서버에 연결하고 디렉토리를 미러링하여 생성 된 모든 새 파일을 가져온 다음 모든 CSV 파일을 가져 와서 하나의 파일로 저장 한 다음 업로드합니다 이 더 큰 CSV 파일 내의 데이터

기본적으로 SQL * Loader는 테이블에 레코드가 처음 존재하는 경우 레코드를 삽입하지 않는 방법을 찾고 있습니다.

테이블은 최대 1,000 만 개의 레코드를 보유 할 수 있으며 때로는 이러한 파일을 잘못 다운로드해야하므로 일부 레코드가 반복 될 수 있습니다.

필요한 두 필드에 고유 키를 입력했습니다.

최대 오류를 스크립트가 삽입하려고 시도하는 행 수로 변경하려고 시도했지만 반복적 인 레코드가없는 경우보다 Constraint Violation 오류를 반환하는 것이 훨씬 느린 것으로 나타났습니다. 정말 큰 로그 파일.

SQL * Loader 제어 파일 내에 조건을 두는 방법이 있습니까? (두 필드에서 반복 될 수는 있지만 둘 다 동시에 수행 할 수 없으므로)?

또는이 프로세스의 속도를 높이는데 도움이 될 것 같습니까?

보너스 질문 : 10 개의 CSV 파일을 각각 SQL * Loader로 보내거나 그 중 10 개의 데이터를 포함하는 단일 파일을 만드는 것이 더 좋습니까?

+0

동일한 CSV 파일을 여러 번 가져 오는 것과 다른 CSV 파일에서 중복 될 수있는 데이터가 있으면 문제가 있는지 명확히 확인하십시오. – Gnudiff

+0

@ 그누 디프 나는 그것을 반영하도록 편집했습니다. 필자는 결국 CSV 파일이 반복되는 것에 신경 쓰지 않습니다. 스크립트가 이미 테이블에있는 행을 무시하기를 원하기 때문입니다. –

+0

좋아. 문제는 CSV (sort & uniq가 도움이 될 것입니다)에서 중복 행이라는 생각에 기초하여 대답을 작성하기 시작했으나 실제 SQL 테이블을 확인해야하는 경우 SQL 내에서 수행해야합니다. – Gnudiff

답변

2

는 solllodolllo 대답 당으로 수입 임시 테이블에 기록하지만

DELETE FROM temptable WHERE id IN (SELECT id FROM yourtable)? 

그 후에 당신은 yourtable에 TEMPTABLE 삽입 할 수 있습니다.

물론 이것은 행이 다른 것과 다를 수있는 방법에 따라 다릅니다. 아마 그 질문에 그것을 나타내는 것이 좋을 것입니다.

+0

감사합니다.이 접근 방식은 필자가 필요로하는대로 작동합니다. –

0

SQL Loader가 테이블에 이미있는 레코드를 삽입하지 않도록하려면 SQL Loader가 필요한 조건을 충족시키지 않으면 레코드를 건너 뛰게하는 조건문을 사용할 수 있습니다. 예를 들어 :

LOAD DATA 
INFILE 'YourData.dat' 
BADFILE 'YourBadData.bad' 
APPEND INTO TABLE YourTable 
WHEN (Condition 1 = TRUE) AND (Condition 2 = FALSE) 
{ 
... 

은 초기로드 프로세스의 속도를하려면, 당신은 다음 임시 테이블에 모든 레코드를 삽입 영구 테이블에 고유 한 모든 행을 삽입 할 SELECT 문을 사용할 수 있습니다.

INSERT INTO YourTable 
SELECT DISTINCT [fields] 
FROM tempYourTable 
+0

이 스크립트에서는 동일한 작업이 가져온 CSV 파일 내에서 반복되는 레코드를 가질 가능성이 거의 없습니다 (실질적으로 불가능). 그 레코드 중 일부는 이미 테이블에 저장됩니다.이 레코드를 건너 뛰려면 SQL * Loader가 필요합니다. 그리고 당신의 쿼리가 올바르게 읽히고 있다면, 단순히 temp 테이블에서 반복되지 않는 모든 값을 반환 할 것입니다 (모두 내 경우에는). –

+0

그런 경우 임시 테이블에서 기존 레코드를 모두 삭제 한 다음 삽입을 수행하는 다른 단계를 추가 할 수 있습니다. 단계는 다음과 같습니다. 1. 임시 테이블에 레코드를 삽입하십시오. 2. 레코드가 영구 테이블에 있으면 임시 테이블에서 삭제하십시오. 3. 임시 테이블에서 영구 테이블에 삽입하십시오. – solllodolllo