Проблема, у нас есть огромное количество записей (больше чем миллион), чтобы быть вставленными в единственную таблицу из JAVA-приложения. Записи создаются кодом Java, это не перемещение от другой таблицы, поэтому ВСТАВЬТЕ/ВЫБЕРИТЕ, не поможет.
В настоящее время мое узкое место является операторами INSERT. Я использую PreparedStatement для ускорения процесс, но я не могу получить больше чем 50 перетрески в секунду на нормальном сервере. Таблица не является сложной вообще, и нет никаких индексов, определенных на ней.
Процесс занимает слишком много времени, и время это, взятия сделают проблемы.
Что я могу сделать для получения, максимальная скорость (ВСТАВЬТЕ в секунду), возможный?
База данных: MS SQL 2008. Приложение: основанный на Java, использующий драйвер Microsoft JDBC.
Используйте BULK INSERT - он предназначен именно для того, о чем вы спрашиваете, и значительно увеличивает скорость вставки.
Также (на случай, если у вас действительно нет индексов) вы можете рассмотреть возможность добавления индексов - некоторые индексы (в основном индекс один на первичный ключ) могут улучшить производительность вставок.
Фактическая скорость, с которой вы сможете вставлять записи, будет зависеть от точных данных, структуры таблицы, а также от аппаратного обеспечения / конфигурации самого SQL-сервера, поэтому я не могу дать вам никаких цифр.
Я бы порекомендовал использовать для этого движок ETL. Вы можете использовать Pentaho . Это бесплатно. Механизмы ETL оптимизированы для массовой загрузки данных, а также любых форм преобразования / проверки, которые требуются.
Рассматривали ли вы использование пакетных обновлений ?
Есть ли в таблице какое-либо ограничение целостности или триггер? Если это так, то бросьте его перед вставкой, но вы должны быть уверены, что можете позволить себе последствия.
Посмотрите на утилиту bcp для Sql Server.
Это означает значительное изменение в вашем подходе, поскольку вы будете генерировать файл с разделителями и использовать внешнюю утилиту для импорта данных. Но это самый быстрый метод вставки большого количества записей в базу данных Sql Server, и он ускорит время загрузки на много порядков.
Кроме того, это одноразовая операция, которую вам нужно выполнить, или что-то, что будет происходить регулярно? Если это разовая операция, я бы предложил даже не кодировать этот процесс, а выполнить экспорт/импорт с помощью комбинации db-утилит.
Пакетная вставка. То есть, отправляйте только 1000 строк за раз, а не по одной строке за раз, таким образом вы значительно сократите количество обходов/вызовов сервера
Выполнение пакетных операций на MSDN для драйвера JDBC. Это самый простой метод, не требующий реинжиниринга для использования настоящих пакетных методов.
Каждая вставка должна быть разобрана, скомпилирована и выполнена. Пакетный метод означает гораздо меньше парсинга/компиляции, потому что 1000 (например) вставок будут скомпилированы за один раз
Есть и лучшие способы, но этот работает, если вы ограничены сгенерированными INSERT'ами
.