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

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

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

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

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

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

7 ответов


использовать МАССОВАЯ ВСТАВКА - Он предназначен именно для того, что вы просите и значительно увеличивает скорость вставки.

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

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


пакетные вставки. То есть, отправляйте только 1000 строк за раз, а не одну строку за раз, поэтому вы значительно уменьшаете туда и обратно/вызовы сервера

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

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

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


вы изучили массовые операции массовые операции?


вы думали использовать пакетные обновления?


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


посмотреть в утилита bcp Sql Server.

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

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


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