Получить доступ

Нужно вставить 100 000 строк через JDBC. Что даст наибольший эффект?

MiddleJDBCPostgreSQL
Ещё спрашивают так:
  • Как быстро вставить много строк?
Коротко

Главные потери — сетевые обходы и коммиты на каждую строку. Батчи (addBatch/executeBatch) и коммит пачками по тысяче строк дают ускорение в десятки раз.

  • PostgreSQL: reWriteBatchedInserts=true склеивает вставки в многострочный INSERT
  • Ещё быстрее — COPY (CopyManager)
  • Отключить autocommit; для огромных загрузок — временно убрать индексы и триггеры

А ещё В Hibernate батчи требуют hibernate.jdbc.batch_size и не работают с IDENTITY-генерацией id

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

При построчной вставке с автокоммитом каждая строка стоит один сетевой обмен плюс запись журнала и синхронизацию на диск — задержка складывается 100 000 раз. Батч отправляет группу операций одним обменом, а отключение автокоммита позволяет коммитить пачками, скажем по тысяче строк, что резко сокращает число синхронизаций. Полезные детали: у MySQL для реальной склейки в один INSERT нужен параметр rewriteBatchedStatements, а размер пачки подбирают компромиссом между эффективностью и объёмом повторной работы при сбое. Statement вместо PreparedStatement не только не ускорит, но и откроет дорогу SQL-инъекции.

Что хотят услышать

  • Почему построчная вставка медленная.
  • Батчи и коммит пачками.
  • COPY и настройки драйвера — плюс.

Частые ошибки

  • Оставлять autocommit включённым при массовой загрузке.
  • Делать батч из ста тысяч операций одной транзакцией и раздувать журнал.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Пакетная отправка через addBatch/executeBatch с отключённым autocommit — вместо 100 000 сетевых обменов будет несколько сотен
  • ✗Увеличение размера пула соединений до 100
  • ✗Замена PreparedStatement на Statement для снижения накладных расходов
  • ✗Выполнение каждой вставки в отдельной транзакции для надёжности

Что спросят дальше

  • Как выбрать размер пачки?
  • Чем массовая загрузка через COPY отличается от батчей?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем