Нужно вставить 100 000 строк через JDBC. Что даст наибольший эффект?
- Как быстро вставить много строк?
Главные потери — сетевые обходы и коммиты на каждую строку. Батчи (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 отличается от батчей?
Разбор темы
- JDBC и безопасные запросы
Connection/Statement/ResultSet, PreparedStatement против инъекций, ручные транзакции, ресурсы и пул соединений.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.