복붙노트

[SQL] 오라클에 자바에서 대량 삽입

SQL

오라클에 자바에서 대량 삽입

나는 빠른 속도로 오라클에 많은 작은 행을 삽입해야합니다. (5 개 필드).

MySQL과, 그때, 100 그룹으로 삽입을 깰 100 개 삽입의 모든 그룹에 대해 하나의 INSERT 문을 사용합니다.

그러나 오라클, 사용자 피드백은 대량 삽입 (1000-30000에서 아무 곳)가 너무 느리다는 것이다.

내가 오라클에 자바에서 프로그램 삽입 속도를하는 데 사용할 수있는 유사한 트릭이 있습니까?

해결법

  1. ==============================

    1.당신은 많은 행을 삽입 배치에 대한 Spring의 DAO 모듈을 사용할 수 있습니다.

    당신은 많은 행을 삽입 배치에 대한 Spring의 DAO 모듈을 사용할 수 있습니다.

    주문의 컬렉션을 삽입 한 예는 하나의 업데이트에 데이터베이스에 객체 :

    public class OrderRepositoryImpl extends SimpleJdbcDaoSupport implements
            OrderRepository {
    
        private final String saveSql = "INSERT INTO orders(userid, username, coffee, coffeename, amount) "
                + "VALUES(?, ?, ?, ?, ?)";
    
        public void saveOrders(final Collection<Order> orders) {
            List<Object[]> ordersArgumentList = new ArrayList<Object[]>(orders
                    .size());
    
            Object[] orderArguments;
            for (Order order : orders) {
                orderArguments = new Object[] { order.getUserId(),
                        order.getUserName(), order.getCoffe(),
                        order.getCoffeeName(), order.getAmount() };
    
                ordersArgumentList.add(orderArguments);
            }
    
            getSimpleJdbcTemplate().batchUpdate(saveSql, ordersArgumentList);
        }
    }
    
  2. ==============================

    2.당신은 당신이 데이터베이스에이 기록을 전달하는 방법을 말을하지 않습니다. 이 멋진 FORALL 벌크 작업의 오라클의 많은의 사용을 허용하는 가장 좋은 방법은, 배열을 사용하는 것입니다.

    당신은 당신이 데이터베이스에이 기록을 전달하는 방법을 말을하지 않습니다. 이 멋진 FORALL 벌크 작업의 오라클의 많은의 사용을 허용하는 가장 좋은 방법은, 배열을 사용하는 것입니다.

    이 예제 패키지에는 두 가지 절차가 있습니다. T23 레코드 수집 및 배열을 사용하여 해당 테이블에 삽입 레코드를 일괄 한 (다섯 개 숫자 열을 포함하는 테이블)을 채워 하나.

    SQL> create or replace package p23 as
      2      type t23_nt is table of t23%rowtype;
      3      function pop_array ( p_no in number )
      4          return t23_nt;
      5      procedure ins_table ( p_array in t23_nt );
      6  end p23;
      7  /
    
    Package created.
    
    SQL> create or replace package body p23 as
      2
      3      function pop_array ( p_no in number )
      4          return t23_nt
      5      is
      6          return_value t23_nt;
      7      begin
      8          select level,level,level,level,level
      9          bulk collect into return_value
     10          from dual
     11          connect by level <= p_no;
     12          return return_value;
     13      end pop_array;
     14
     15      procedure ins_table
     16              ( p_array in t23_nt )
     17      is
     18          s_time pls_integer;
     19      begin
     20
     21          s_time := dbms_utility.get_time;
     22
     23          forall r in p_array.first()..p_array.last()
     24              insert into t23
     25              values p_array(r);
     26
     27          dbms_output.put_line('loaded '
     28                  ||to_char(p_array.count())||' recs in '
     29                  ||to_char(dbms_utility.get_time - s_time)
     30                  ||' csecs');
     31      end ins_table;
     32  end p23;
     33  /
    
    Package body created.
    
    SQL>
    

    다음은 몇 가지 샘플 실행의 출력은 다음과 같습니다

    SQL> declare
      2      l_array p23.t23_nt;
      3  begin
      4      l_array := p23.pop_array(500);
      5      p23.ins_table(l_array);
      6      l_array := p23.pop_array(1000);
      7      p23.ins_table(l_array);
      8      l_array := p23.pop_array(2500);
      9      p23.ins_table(l_array);
     10      l_array := p23.pop_array(5000);
     11      p23.ins_table(l_array);
     12      l_array := p23.pop_array(10000);
     13      p23.ins_table(l_array);
     14      l_array := p23.pop_array(100000);
     15      p23.ins_table(l_array);
     16  end;
     17  /
    loaded 500 recs in 0 csecs
    loaded 1000 recs in 0 csecs
    loaded 2500 recs in 0 csecs
    loaded 5000 recs in 1 csecs
    loaded 10000 recs in 1 csecs
    loaded 100000 recs in 15 csecs
    
    PL/SQL procedure successfully completed.
    
    SQL>
    SQL> select count(*) from t23
      2  /
    
      COUNT(*)
    ----------
        119000
    
    SQL>
    

    나는 모든하지만 대부분의 사용자의 요구를 만족해야 0.15 초에서 10 만 개 기록을 삽입 생각합니다. 그래서, 질문, 당신은 어떻게 당신의 삽입에 접근 할입니까?

  3. ==============================

    3.현재 MySQL은 오라클 그래서 아마도 간단한 해결책이 MySQL을 숙박에있을 것입니다 ...

    현재 MySQL은 오라클 그래서 아마도 간단한 해결책이 MySQL을 숙박에있을 것입니다 ...

    그렇지 않으면 그룹이 트랜잭션을 커밋하고 삽입의 다음 그룹의 새 트랜잭션을 시작 후 완료되면 당신은 삽입의 그룹을 시작하기 전에 당신은 트랜잭션이 시작되었는지 확인해야합니다.

    또한 삽입 시간을 느리게 할 수도 불필요한 인덱스 정의 확인.

    업데이트 ... 대량 삽입은 (추출로드를 변환), 그래서 당신은 주전자 또는 talend 스튜디오 펜타 같은 자바 기반의 ETL 도구를 사용하여 고려했다 ETL의 마지막 단계를 의미합니다.

    펜타 여기에 오라클 벌크 로딩 기능을 설명합니다.

    빠른 구글은 또한 Talend는 오라클 대량로드에 대한 몇 가지 지원을하고 몇 가지 예비 증거를 보여줍니다.

  4. from https://stackoverflow.com/questions/2716818/bulk-insert-from-java-into-oracle by cc-by-sa and MIT license