Производительность Oracle и JDBC: ВСТАВИТЬ ВСЕ против подготовленного состояния - PullRequest
13 голосов
/ 04 февраля 2011

У меня есть приложение Java с бэкэндом базы данных Oracle, в которое мне нужно вставить несколько строк.Я видел дискуссию о вставке нескольких строк в Oracle , но меня также интересует, как влияет на производительность при добавлении JDBC в микс.

Я вижу несколько возможностей:

Вариант 1: использовать однострочную вставку PreparedStatement и выполнить ее несколько раз:

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: Используйте функциональность addBatch PreparedStatement:

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, но я не уверен, что это действительно будет быстрее, если выдобавить накладные расходы на создание файла CSV ...

Так, какой вариант будет работать быстрее всего?

Ответы [ 3 ]

9 голосов
/ 05 февраля 2011

Используйте функциональность addBatch() PreparedStatement для всего, что меньше 1 000 000 строк.

Каждый дополнительный компонент, добавляемый в код, увеличивает зависимости и точки сбоя.

Если вы пойдете по этому маршруту (внешние таблицы, загрузчик sql и т. Д.), Убедитесь, что он действительно того стоит.

Сериализация данных в файл CSV, перемещение в место, читаемое базой данных,легко займет секунду или около того.

За это время я мог бы вставить 20 000 строк, если бы я просто набрал его и начал вставлять с JDBC.

2 голосов
/ 04 февраля 2011

SQL Loader, кажется, лучше даже без прямой загрузки пути, но его сложно поддерживать. Пакетная вставка в 2-4 раза быстрее, чем операторы одиночной вставки. Вставьте все как пакетную вставку, и это будет быстрее, чем реализация PL / SQL.

Также вы можете прочитать эту тему AskTom.

1 голос
/ 05 февраля 2011

Использование пакета может быть прозрачным для программиста.Вот цитата из здесь :

Установка значения пакета соединения

Вы можете указать значение пакета по умолчанию для любого подготовленного оператора Oracle в вашем соединении Oracle.> Для этого используйте метод setDefaultExecuteBatch () объекта OracleConnection.Например, следующий код устанавливает значение пакета по умолчанию равным 20 для всех подготовленных объектов операторов, связанных с объектом подключения conn:

((OracleConnection) conn) .setDefaultExecuteBatch (20);

Evenхотя это устанавливает значение пакета по умолчанию для всех подготовленных операторов соединения, вы можете переопределить его, вызвав setDefaultBatch () для отдельных подготовленных операторов Oracle.

Значение пакета соединения будет применяться к объектам операторов, созданным после этого пакетазначение было установлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...