일괄 적으로 저장 프로 시저를 사용하여 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 초 내에 저장됩니다.
이유가 표시 되나요? 내 코드에 비효율적입니까? 아니면 스토어드 프로 시저를 호출하면 오라클이 느려지는 좋은 이유가 있습니까?
프로 시저를 호출하면 항상 오버 헤드가 발생합니다. 언제 어디서'커밋 '을하고 있니? –
그건 정말 좋은 질문입니다. 나는 뭔가를 돌보는 것을 잊어 버렸습니다. 명백히 커밋하지는 않았지만 데이터는 어쨌든 존재하기 때문에 Spring은 자동 커밋을 발행합니다. – Marged
호기심에서 스트레이트 삽입물 대신 절차에서 수행해야하는 이유가 무엇입니까? 매번 다른 테이블에 데이터를 삽입해야 할 필요가 있습니까 (동의어가 작동하지 않습니다)? –