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()
의 기능.PreparedStatement
1,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
'programing' 카테고리의 다른 글
C 프로그램에서 C++로 만든 공유 라이브러리를 사용할 수 있습니까? (0) | 2023.07.22 |
---|---|
Firebase 3에서 토큰에 대한 서버 측 검증이 여전히 가능합니까? (0) | 2023.07.22 |
org.postgresql.dll.PSQL 예외: 오류: 값이 너무 깁니다(255). 형식 문자가 다양합니다(255) (0) | 2023.07.22 |
PyCharm이 가변 기본 인수에 대해 경고하는 이유는 무엇입니까?어떻게 하면 그들을 피할 수 있을까요? (0) | 2023.07.22 |
SpringFox Swagger - 모델의 옵션 및 필수 필드 (0) | 2023.07.22 |