#java #sql #jdbc #sqlyog
#java #sql #jdbc #sqlyog
Вопрос:
У меня есть CSV-файл с 50000 записями, которые я хочу импортировать в SQL с помощью batch в JDBC.
Каким должен быть оптимальный размер пакета для него?
Ответ №1:
Согласно официальным рекомендациям Oracle, оптимальный размер пакета составляет от 50 до 100
Доказательство: https://docs.oracle.com/cd/E11882_01/java.112/e16548/oraperf.htm#JJDBC28754
Oracle рекомендует использовать стандартные функции JDBC, когда это возможно. Эта рекомендация также применима к пакетной обработке обновлений. Пакетное обновление Oracle сохраняется в первую очередь для обеспечения обратной совместимости.
Как для стандартной пакетной обработки обновлений, так и для пакетной обработки обновлений Oracle Oracle рекомендует сохранять размеры пакетов в общем диапазоне от 50 до 100. Это связано с тем, что, хотя драйверы поддерживают большие пакеты, они, в свою очередь, приводят к большому объему памяти без соответствующего увеличения производительности. Очень большие пакеты обычно приводят к снижению производительности по сравнению с меньшими пакетами.
Хорошего дня
Комментарии:
1. Пакетирование в стиле Oracle было отменено несколько выпусков назад. Я не помню, в каком выпуске.
Ответ №2:
50k записей — это небольшой набор данных. Больший размер пакета поможет, но если вы предполагаете, что ваш сетевой переход сервера базы данных в оба конца составляет 10 мс:
- Размер пакета 50 => 50 000 строк / 50 размер пакета * задержка 10 мс = накладные расходы на задержку 10000 мс = 10 сек накладных расходов на задержку
- Размер пакета 100 => 50 000 строк / 100 размер пакета * задержка 10 мс = накладные расходы на задержку 5000 мс = 5 сек накладных расходов на задержку
Начните с установки разумного размера пакета для операторов пакетной вставки, а затем измерьте, сколько времени на самом деле требуется для вставки строк, не забудьте очистить после массовой вставки.
Если для вставки 50 тысяч записей требуется 1 минута, вам нужно сосредоточиться на оптимизации процесса вставки, а не на размере пакета JDBC, поскольку только часть общего времени затрачивается на издержки задержки.
Для больших наборов данных вы не должны использовать JDBC. Существуют инструменты, предназначенные для задачи массовой вставки, например, у Oracle есть загрузчик SQL *.
Комментарии:
1. Также важно, вставляется ли весь набор данных с одним и тем же SQL и всегда ли значения, привязанные к каждому параметру, одинаковы. Если иногда вы привязываете ДАТУ к параметру 1, а иногда к МЕТКЕ ВРЕМЕНИ, это значительно замедлит работу. Каждое значение, привязанное к заданному параметру, всегда должно быть одного и того же типа. Драйвер будет работать, если это не так, но это будет намного медленнее. Аналогично, если пакет содержит более одного SQL. Каждый пакет должен быть создан только с одним SQL, одним PreparedStatement. Опять же, это будет работать, если вы этого не сделаете, но это будет намного медленнее.