Самый быстрый способ вставить очень большое количество записей в таблицу в SQL - PullRequest
11 голосов
/ 04 мая 2010

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

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

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

Что я могу сделать, чтобы получить максимально возможную скорость (ВСТАВКА в секунду)?

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

Ответы [ 7 ]

10 голосов
/ 04 мая 2010

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

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

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

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

6 голосов
/ 04 мая 2010

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

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

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

2 голосов
/ 04 мая 2010

Вы рассматривали массовые операции массовые операции ?

1 голос
/ 04 мая 2010

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

1 голос
/ 04 мая 2010

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

0 голосов
/ 04 мая 2010

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

0 голосов
/ 04 мая 2010

Загляните в утилиту bcp Sql Server.

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

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

...