Самый быстрый способ вставки очень большого количества записей в таблицу в 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-движки оптимизированы для выполнения массовой загрузки данных, а также любых необходимых форм преобразования/проверки.