2015-01-07 2 views
2

일괄 적으로 저장 프로 시저를 사용하여 Oracle 11g 데이터베이스에 데이터를 대량 삽입합니다. 업로드 테스트를하는 동안 데이터를 처리하는 데 걸리는 시간이 상당히 길다는 것을 느꼈습니다. 그래서 저장 프로 시저를 건너 뛰고 저장 프로 시저에서 사용하는 insert 문을 사용하여 동일한 데이터를 대량 삽입했습니다. 결과 :이 방법은 더 빠릅니다.오라클 : 일괄 처리 삽입 대신 일괄 처리를 사용할 때 성능이 크게 저하됨

가장 쉬운 해결책은 저장 프로 시저를 제거하는 것이지만 데이터베이스 사용자가 사용하기를 원한다는 것입니다. 그래서 코딩 된 방식이 성능 저하의 원인이 아니라는 것을 확신하고 싶습니다. 나는 7500 개 항목으로이를 테스트 할 때

CREATE OR REPLACE PROCEDURE "X"."FOO" 
(SomeDate in Timestamp, String1 in VARCHAR2, String2 in VARCHAR2, String3 in VARCHAR2, String4 in VARCHAR2) 
AS 
    begin 
    INSERT 
INTO 
    X.BAR 
    (
     SOMEDATE, 
     STRING1, 
     STRING2, 
     STRING3, 
     STRING4 
    ) 
    VALUES 
     (SomeDate,String1,String2,String3,String4); 
end;    

이 업로드 70 초 정도 걸립니다 : 저장 프로 시저가 이런 식으로 정의된다

try { 
    jdbcTemplate.batchUpdate("call foo(?,?,?,?,?)", 
    new BatchPreparedStatementSetter() { 
    @Override 
    public void setValues(PreparedStatement ps, int i) throws SQLException { 
     LookupEntry le = cachedEntries.get(i); 
    ps.setTimestamp(1, new Timestamp(le.... 
    ps.setString(2, le.... 
    ps.setString(3, le.... 
    ps.setString(4, le.... 
    ps.setString(5, le... 
    } 

    @Override 
    public int getBatchSize() { 
    int size = cachedEntries.size(); 
    return size; 
    } 
    }); 
    } catch (DuplicateKeyException e) { 
    log.error("bummer ..., e); 
    } 

:

내가 저장 프로 시저를 호출하는 데 사용하는 코드입니다 .

그러나 삽입 문을 내 코드에 직접 복사하면 (나머지는 변경되지 않음) 동일한 데이터가 4 초 내에 저장됩니다.

이유가 표시 되나요? 내 코드에 비효율적입니까? 아니면 스토어드 프로 시저를 호출하면 오라클이 느려지는 좋은 이유가 있습니까?

+1

프로 시저를 호출하면 항상 오버 헤드가 발생합니다. 언제 어디서'커밋 '을하고 있니? –

+0

그건 정말 좋은 질문입니다. 나는 뭔가를 돌보는 것을 잊어 버렸습니다. 명백히 커밋하지는 않았지만 데이터는 어쨌든 존재하기 때문에 Spring은 자동 커밋을 발행합니다. – Marged

+0

호기심에서 스트레이트 삽입물 대신 절차에서 수행해야하는 이유가 무엇입니까? 매번 다른 테이블에 데이터를 삽입해야 할 필요가 있습니까 (동의어가 작동하지 않습니다)? –

답변

1

직접 INSERT 일괄 처리를 고수하고 더 이상이 절차를 사용하지 않습니다. 아마도 프로 시저와 비슷한 방식으로 내 프로그램을 데이터베이스 구조에서 분리하므로 try에 뷰를 삽입 할 것입니다.

관련 문제