объемная вставка от Java в Oracle

Я должен вставить много небольших строк быстро в Oracle. (5 полей).

С MySQL я повреждаю вставки в группы 100, затем использую, каждый вставляет оператор для каждой группы 100, вставляет.

Но с Oracle, отзывы пользователей - то, что масса вставляет (где угодно от 1000-30000), являются слишком медленными.

Существует ли подобный прием, который я могу использовать для ускорения программных вставок от Java в Oracle?

15
задан APC 19 November 2019 в 08:41
поделиться

3 ответа

В настоящее время MySQL - это Oracle, поэтому, возможно, более простым решением будет оставаться на MySQL ...

В противном случае вы должны убедиться, что транзакция запущена, прежде чем вы начнете свою группу вставок, после того, как группа будет завершена, зафиксируйте транзакцию и начните новую транзакцию для следующей группы вставок.

Также проверьте наличие ненужных определений индексов, которые могут замедлять время вставки.

Обновлено ...
Массовая вставка относится к последнему этапу ETL (Извлечение нагрузки преобразования), поэтому рассматривали ли вы возможность использования инструмента ETL на основе Java, такого как чайник пентахо или таленд-студия .

Pentaho описывает свои средства массовой загрузки Oracle здесь .

Быстрый поиск в Google также показывает некоторые предварительные доказательства того, что Talend также имеет некоторую поддержку массовой загрузки Oracle.

0
ответ дан 1 December 2019 в 04:46
поделиться

Вы не говорите, как вы передаете эти записи в базу данных. Лучше всего использовать массив, так как это позволяет использовать множество изящных массовых операций FORALL в Oracle.

В этом примере пакета есть две процедуры. Один, который заполняет коллекцию записей 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>

Я думаю, что вставка 100 000 записей за 0,15 секунды должна понравиться всем, кроме самых требовательных пользователей. Итак, вопрос в том, как вы подходите к своим вставкам?

2
ответ дан 1 December 2019 в 04:46
поделиться

Вы можете использовать модуль DAO Spring для пакетной вставки многих строк.

Пример вставки коллекции объектов Order в базу данных за одно обновление:

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);
    }
}
10
ответ дан 1 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: