programing

Oracle 및 JDBC 성능:INSERT ALL vs prepared Statement.addBatch

cafebook 2023. 7. 22. 10:25
반응형

Oracle 및 JDBC 성능:INSERT ALL vs prepared Statement.addBatch

여러 행을 삽입해야 하는 Oracle 데이터베이스 백엔드가 있는 Java 앱이 있습니다.Oracle에 여러 행을 삽입하는 것에 대한 논의를 보았습니다만, JDBC를 혼합할 때 성능에 어떤 영향을 미치는지도 관심이 있습니다.

몇 가지 가능성이 있습니다.

옵션 1: 단일 행 삽입 준비된 문장을 사용하고 여러 번 실행합니다.

String insert = "Insert into foo(bar, baz) values (?, ?)";
PreparedStatement stmt = conn.prepareStatement(insert);
for(MyObject obj : someList) {
    stmt.setString(1, obj.getBar());
    stmt.setString(2, obj.getBaz());
    stmt.execute();
}

옵션 2: Oracle INSERT ALL 문 작성:

String insert = "INSERT ALL " +
    "INTO foo(bar, baz), (?, ?) " +
    "INTO foo(bar, baz), (?, ?) " +
    "SELECT * FROM DUAL";
PreparedStatement stmt = conn.prepareStatement(insert);
int i=1;
for(MyObject obj : someList) {
    stmt.setString(i++, obj.getBar());
    stmt.setString(i++, obj.getBaz());
}
stmt.execute();

옵션 3: PreparedStatement의 addBatch 기능을 사용합니다.

String insert = "Insert into foo(bar, baz) values (?, ?)";
PreparedStatement stmt = conn.prepareStatement(insert);
for(MyObject obj : someList) {
    stmt.setString(1, obj.getBar());
    stmt.setString(2, obj.getBaz());
    stmt.addBatch();
}
stmt.execute();

CSV 파일을 생성하고 SQL Loader를 사용하는 것도 다른 방법일 것입니다. 하지만 CSV 파일을 생성하는 데 드는 오버헤드를 추가하면 그렇게 하는 것이 정말 빠를지 모르겠습니다.

그렇다면 어떤 옵션이 가장 빨리 작동할까요?

사용addBatch()의 기능.PreparedStatement1,000,000 이하의 경우.

코드에 추가하는 각 구성 요소는 종속성과 실패 지점을 증가시킵니다.

만약 당신이 그 경로(외부 테이블, sql 로더 등)를 따라 간다면, 그것이 정말로 가치가 있는지 확인하십시오.

데이터를 CSV 파일로 직렬화하고 데이터베이스에서 읽을 수 있는 위치로 이동하는 데는 몇 초 정도가 걸립니다.

그 기간 동안, 저는 2만 줄을 삽입할 수 있었습니다. 만약 제가 그것을 빨아들이고 JDBC로 삽입을 시작했다면 말이죠.

SQL Loader는 직접 경로 로드 없이도 더 나은 방법인 것처럼 보이지만 유지하기가 어렵습니다.단일 삽입문보다 2-4배 빠른 배치 삽입문입니다.배치 삽입과 마찬가지로 모두 삽입하면 PL/SQL 구현보다 두 가지 모두 더 빠릅니다.

또한 이 질문 항목을 읽을 수도 있습니다.

배치를 사용하는 것은 프로그래머에게 투명할 수 있습니다.여기서 인용할 내용이 있습니다.

연결 배치 값 설정

Oracle 연결에서 Oracle 준비 문에 대한 기본 배치 값을 지정할 수 있습니다.> 이렇게 하려면 setDefault를 사용합니다.Oracle Connection 개체의 ExecuteBatch() 메서드입니다.예를 들어, 다음 코드는 conn 연결 개체와 연결된 준비된 모든 문 개체에 대해 기본 배치 값을 20으로 설정합니다.

((OracleConnection)conn).setDefault배치 실행(20);

이렇게 하면 연결의 준비된 모든 문에 대한 기본 배치 값이 설정되지만 개별 Oracle 준비 문에서 setDefaultBatch()를 호출하여 이 값을 재정의할 수 있습니다.

연결 배치 값은 이 배치 값이 설정된 후 생성된 문 개체에 적용됩니다.

언급URL : https://stackoverflow.com/questions/4901997/oracle-and-jdbc-performance-insert-all-vs-preparedstatement-addbatch

반응형