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

Проблема, у нас есть огромное количество записей (больше чем миллион), чтобы быть вставленными в единственную таблицу из JAVA-приложения. Записи создаются кодом Java, это не перемещение от другой таблицы, поэтому ВСТАВЬТЕ/ВЫБЕРИТЕ, не поможет.

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

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

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

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

11
задан Iravanchi 4 May 2010 в 14:15
поделиться

7 ответов

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

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

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

6
ответ дан 3 December 2019 в 05:57
поделиться

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

2
ответ дан 3 December 2019 в 05:57
поделиться

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

0
ответ дан 3 December 2019 в 05:57
поделиться

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

1
ответ дан 3 December 2019 в 05:57
поделиться

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

1
ответ дан 3 December 2019 в 05:57
поделиться

Посмотрите на утилиту bcp для Sql Server.

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

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

0
ответ дан 3 December 2019 в 05:57
поделиться

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

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

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

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

.
10
ответ дан 3 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: