2013-04-18 4 views
1

Oracle 10g 데이터베이스에서 테이블 (~ 30,000 레코드)의 대량 업데이트가 필요합니다. 문제는 대상 행을 선택할 수있는 "where"절이 없다는 것입니다. 그러나 각 대상 행은 복합 키를 통해 식별 될 수 있습니다. 여기에서 잡아낸 것은 복합 키의 목록이 데이터베이스가 아닌 외부 소스에 있다는 것입니다.Oracle 데이터베이스 대량 업데이트를위한 최선의 방법

update table1 t set myfield='Updated' where t.comp_key1='12345' and t.comp_key2='98765'; 

이 있습니까 : 현재

나는 복합 키의 목록을 반복하고 기본적으로 다음과 같은 반복 update 문 단지 무리 인 PL/SQL의 절차를 뱉어 자바 프로그램이 이렇게하는 더 좋은 방법인가요? 아니면 우리가 ~ 30K 레코드 만 다루고 있다고 생각하면 충분합니까?

+3

(('12345', '98765'), ('11111', '11111')의 '... 어디에서 t.comp_key1, t.comp_key2를 사용하여 한 번에 무리를 만들 수 있습니다. ('22222', '22222'))'. 업데이트 할 수있는 행 수는 명령문의 최대 길이 (Java 데이터 드라이버로 결정됨)에 따라 다르지만 명령문 당 100 개 이상의 행을 가져올 수 있어야합니다. 아름다운 것은 아니지만 왕복 여행을 많이 절약 할 수 있습니다. –

+1

또는 데이터베이스 전체를 구문 분석하고 [테이블 함수] (http://blog.lishman.com/2008/05/oracle-table-functions.html)를 사용할 수 있습니다. – Ben

답변

2

충분합니다.

기본 키를 사용하여 30,000 건의 업데이트가 모두 하드 해석되는 경우에도 일반적으로 수 초가 소요됩니다. @ 깁스 (Gibbs)가 제안한대로 업데이트를 결합하여 속도를 향상시킬 수 있습니다. 그러나 지금까지는 이것이 매우 가치있는 최적화 프로세스가 아닌 것처럼 보였습니다. 단일 PL/SQL 프로 시저로 모든 작업을 수행하는 것은 현명한 작업이었으며 실제로는 순조로운 행별로 클라이언트 솔루션에 필요한 99 %의 시간을 절약했습니다.

3

키의 외부 소스가 파일 인 경우 가능하면 파일을 가리키는 외부 테이블을 작성하여 파일의 데이터를 관계형 테이블로 표시 한 다음 병합에서 잠재적으로 수행 할 수 있습니다 (업데이트) 문.

관련 문제