Вопрос с собеседования · Базы данных

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования