Самый быстрый способ вставки очень большого количества записей в таблицу в SQL

Проблема заключается в том, что у нас есть огромное количество записей (более миллиона), которые нужно вставить в одну таблицу из приложения Java. Записи создаются кодом Java, это не переход из другой таблицы, поэтому INSERT/SELECT не поможет.

В настоящее время мое узкое место - это инструкции INSERT. Я использую PreparedStatement для ускорения процесса, но я не могу получить более 50 повторений в секунду на обычном сервере. Таблица не совсем сложна, и на ней нет указателей.

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

Что делать, чтобы получить максимальную скорость (INSERT в секунду)?

База данных: MS SQL 2008. Приложение: на основе Java, используя драйвер Microsoft JDBC.

Ответ 1

Используйте BULK INSERT - он предназначен именно для того, что вы просите, и значительно увеличивает скорость вставки.

Кроме того, (на всякий случай, если у вас действительно нет индексов), вы также можете рассмотреть добавление индексов - некоторые индексы (большинство индексных по первичному ключу) могут повысить производительность вставки.

Фактическая скорость, с которой вы сможете вставлять записи, будет зависеть от точных данных, структуры таблицы, а также от аппаратного обеспечения/конфигурации самого SQL-сервера, поэтому я не могу дать вам никаких чисел.

Ответ 2

Загрузите вставки. То есть, отправляйте только 1000 строк за раз, а не одну строку за раз, так что вы сильно сокращаете круглые поездки/серверные вызовы

Выполнение пакетных операций в MSDN для драйвера JDBC. Это самый простой метод без реинжиниринга, чтобы использовать оригинальные массовые методы.

Каждая вставка должна быть проанализирована, скомпилирована и выполнена. Партия будет означать намного меньше разбора/компиляции, потому что 1000 (например) вставки будут скомпилированы за один проход

Есть лучшие способы, но это работает, если вы ограничены созданными INSERT

Ответ 5

Есть ли ограничение целостности или триггер в таблице? Если это так, то вытащить его перед вставками поможет, но вы должны быть уверены, что можете позволить себе последствия.

Ответ 6

Посмотрите утилита bqp сервера Sql.

Это означало бы значительное изменение вашего подхода в том, что вы будете генерировать файл с разделителями и использовать внешнюю утилиту для импорта данных. Но это самый быстрый способ вставки большого количества записей в Sql Server db и ускорит ваше время загрузки на много порядков.

Кроме того, это одноразовая операция, которую вы должны выполнить или что-то, что будет происходить на регулярной основе? Если однажды я предлагаю не кодировать этот процесс, а выполнять экспорт/импорт с помощью комбинации служебных программ db.

Ответ 7

Я бы рекомендовал использовать для этого движок ETL. Вы можете использовать Pentaho. Это бесплатно. Двигатели ETL оптимизированы для выполнения массовой загрузки данных, а также любых форм преобразования/валидации, которые требуются.