2009-07-17 2 views
6

В зависимости от этого вопроса, спрашивает все: Насколько эффективен метод executeBatch? Есть ли тест производительности, который гласит: «Если у вас есть 1000 записей, которые нужно вставить, использование executeBatch вместо executeUpdate сэкономит вам количество циклов базы данных?»Насколько эффективен executeBatch в подготовленном заявлении?

Или это просто конвенция?

EDIT: Вот что я работаю с: DB2 V 8.1, размещенной на Z/OS, веб-приложении, которое будет вставлять 80 000 записей за один раз в случае наихудшего сценария.

+2

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

+1

@skaffman Я не хочу делать то, что принято называть преждевременной оптимизацией. Однако я хотел бы понять, насколько это значительно быстрее. – Jay

+0

Я понимаю это, но вы не можете сделать осознанный выбор без какого-либо бенчмаркинга. – skaffman

ответ

8

Не знаете, какую базу данных вы используете. Когда я запустил тест на это, используя db2 это то, что я видел:

Для записи в базу данных:

1 Вкладыш потребовалось 2500 микросекунд.

10 вставок потребовалось 6000 микросекунд. (600 микросекунд на запись)

10000 вставок потребовалось около 1 миллиона микросекунд. (100 микросекунд на запись)

Производительность максимальная. Все это означает, что в отправке сообщений есть огромные накладные расходы, и использование пакетного метода сводит к минимуму это. Конечно, отправка вложений/обновлений огромными партиями может привести к потере их при сбое приложения.

Также обратите внимание: точные числа будут различаться в зависимости от вашей базы данных и настроек. Поэтому вам нужно будет найти свое «сладкое пятно». Но это дает вам представление.

+0

@ windfinder вы использовали executeBatch для всех вышеперечисленных? И вы сказали, что «огромные партии рискуют потеряться при сбоях приложений» - если я использую управление транзакциями - я должен быть хорош в этом сценарии? – Jay

+0

Да, я использовал executeBatch. Управление транзакциями не будет полностью устранять этот риск, но это может уменьшить его. – Alex

+0

Простейшим способом, если бы я должен был установить autocommit в false и совершить только при возврате executeBatch, как я рискую? – Jay

1

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

+0

@ skaffman, это был мой вопрос - насколько он намного быстрее? Можете ли вы дать мне приблизительную оценку? – Jay

+0

Я бы оценил где-то между 10 и 20 раз, это будет в значительной степени зависеть от самой базы данных. Операция без пакета включает в себя гораздо больше сетевого трафика, поэтому, например, сервер удаления будет выигрывать больше от пакетной обработки, чем локальный. – skaffman

+1

Более 10-20x в моем опыте (для моего конкретного случая использования). –

1

По моему опыту, это значительно быстрее - даже если вы вставляете/обновляете только несколько записей за раз. Если вы делаете больше одного обновления, я бы почти всегда рекомендовал их доработать, если это имеет смысл.

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

0

JDBC спецификация Глава 14 говорит, что представление нескольких операторов SQL, а индивидуально, может значительно повысить производительность

0

В batchExecute() заявления обновления принимают больше времени, а затем вставить заявления я Тринга с 5001 вставки и обновления ведомости рацион производительности составляет 15:84

+0

А где ответ? – Rizier123

Смежные вопросы