Вставки в большие базы данных Java

У меня есть база данных, в которую мне нужно вставлять пакеты данных (около 500 тысяч записей за раз). Я тестировал derby и наблюдал время вставки около 10-15 минут для такого количества записей (я делал пакетную вставку на Java).

Это время кажется медленным (работа на обычном ноутбуке)? И есть ли подходы к его ускорению?

спасибо,

Джефф


person Jeff Storey    schedule 19.02.2010    source источник


Ответы (1)


Это время кажется совершенно разумным и согласуется со временем, которое я наблюдал. Если вы хотите, чтобы это работало быстрее, вам нужно использовать параметры массовой вставки и отключить функции безопасности:

  • Используйте PreparedStatements и пакеты от 5000 до 10 000 записей, если только это НЕ ДОЛЖНА быть одна транзакция.
  • Использовать параметры массовой загрузки в СУБД
  • Временно отключить проверку целостности для вставки
  • Временно отключите индексы или удалите индексы и заново создайте их после вставки.
  • Отключите ведение журнала транзакций и снова включите его позже.

EDIT: транзакции базы данных ограничены дисковым вводом-выводом, а на ноутбуках и большинстве жестких дисков важным числом является время поиска для диска.

Ноутбуки, как правило, имеют довольно медленные диски со скоростью 5400 об/мин. При такой скорости время поиска составляет около 5 мс. Если мы предположим, что для каждой записи выполняется один поиск (в большинстве случаев это завышенная оценка), для вставки всех строк потребуется 40 минут (500000 * 5 мс). Теперь использование механизмов кэширования и механизмов последовательности несколько уменьшает это, но вы можете видеть, откуда берется проблема.

Я (конечно) сильно упрощаю проблему, но вы можете видеть, к чему я клоню; неразумно ожидать, что базы данных будут работать с той же скоростью, что и последовательный массовый ввод-вывод. Вы должны применить какую-то индексацию к своей записи, а это требует времени.

person BobMcGee    schedule 19.02.2010