В последнее время я много работал со вставками и выборками из базы данных. Часто работая с несколькими миллионами данных, я понял, что вам нужны разные подходы к этим вещам. Я много читал о пакетной обработке баз данных oracle, и это, безусловно, обеспечивает хороший прирост производительности, но я не уверен, работает ли он так, как задумано в моем случае. Итак, теперь мне удалось очень эффективно экспортировать около 2,8 миллиона записей. (около 3,5 минут) Мне удалось это с помощью параметра выборки строк.
Теперь нужно импортировать эти данные обратно в базу данных oracle. У меня есть количество файлов. (1300 ~). Я попытался изменить размер пакета и не заметил никакой разницы в производительности. Правильно ли я использую пакетные вставки? Я пробовал:
- Размер партии 4: 7:07 мин.
- Размер партии 10: 6:02 мин
- Размер партии 50: 8:42 мин
- Размер партии 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 миллиона записей звучат неплохо, но похоже, что есть какая-то проблема.