Размер партии не влияет на скорость в oracle вставка - PullRequest
0 голосов
/ 25 мая 2020

В последнее время я много работал со вставками и выборками из базы данных. Часто работая с несколькими миллионами данных, я понял, что вам нужны разные подходы к этим вещам. Я много читал о пакетной обработке баз данных oracle, и это, безусловно, обеспечивает хороший прирост производительности, но я не уверен, работает ли он так, как задумано в моем случае. Итак, теперь мне удалось очень эффективно экспортировать около 2,8 миллиона записей. (около 3,5 минут) Мне удалось это с помощью параметра выборки строк.

Теперь нужно импортировать эти данные обратно в базу данных oracle. У меня есть количество файлов. (1300 ~). Я попытался изменить размер пакета и не заметил никакой разницы в производительности. Правильно ли я использую пакетные вставки? Я пробовал:

  1. Размер партии 4: 7:07 мин.
  2. Размер партии 10: 6:02 мин
  3. Размер партии 50: 8:42 мин
  4. Размер партии 100: 8:56 мин.

Я ожидал какого-то разумного изменения, но не думаю, что это имеет большой смысл.

            Connection connection  = cpprov.getConnection();
            connection.setAutoCommit(false);

            for (String fileName : fileNames) {

                // ... process data into array etc.. (datatypes, data, charSizes) 
                // ... create sql insert statement with 54 wildcard variables (sqlstatement)

                try (PreparedStatement prepStatement = connection.prepareStatement(sqlStatement);){
                    for (int i = 1; i < lineCount; i++) {

                        String[] currentLineData = handleFieldInput(i, datatypes, data);
                        // insert parameters to the prepStatement 
                        handlePrepStatement(prepStatement, datatypes, currentLineData, charSizes);

                        prepStatement.addBatch();

                        if(i % batchSize == 0) {
                            int[] executedBatches;
                            try {
                                executedBatches = prepStatement.executeBatch();
                                connection.commit();
                                importedRecords += executedBatches.length;
                            } catch (Exception e) {
                                LOG.error(Arrays.toString(e.getStackTrace()));
                            } 
                        }
                    }

                    // execute remaining batches
                    int [] executedBatches = prepStatement.executeBatch();
                    importedRecords += executedBatches.length;
                } catch (Exception e) {

                }

            }

            cpprov.closeConnection(connection);

Очевидно, 7 минут для вставки 2,8 миллиона записей звучат неплохо, но похоже, что есть какая-то проблема.

...