2015-07-18 3 views
-1

Некоторое время назад мы столкнулись с проблемой массовой вставки \ update в базу данных MS SQL.MS SQL Bulk update insert

Задача была довольно простой - получить данные из БД, выполнить преобразование данных и обновить родительскую таблицу и заполнить дочернюю таблицу. Объем данных огромен, поэтому нас интересовал наиболее эффективный способ сделать это. Делать все в БД (хранимые процедуры, обработка файлов и т. Д.) Не применимо, так как нам нужно получить часть информации от стороннего приложения.

Хотя в Интернете вы можете найти множество статей о том, как отключить autoCommit и выполнить пакетные вставки \ обновления, в любом случае он будет отправлять запросы один за другим. Это применимо для большинства бесплатных драйверов jdbc, включая самый популярный - net.sourceforge.jtds.jdbc.Driver (http://sourceforge.net/p/jtds/discussion/129584/thread/8e89906c/). Возможно, DataDirect поддерживает такую ​​функциональность, но это не бесплатно. FIY - List of JDBC drivers for SQL Server 2008 (comparison).

Пожалуйста, поделитесь опытом с решением подобных проблем.

С наилучшими пожеланиями,
Alex

+0

Если вы делитесь знаниями, то вы можете разделить часть решения на вопрос и добавить его как свой собственный ответ – Spidey

+0

@Nimesh, спасибо за ваш комментарий. Сообщение обновлено –

ответ

0

Мы решили эту проблему другим способом. Так как нам нужно выполнить 2 части изменения данных (вставить новую дочернюю запись и обновление существующего родителя с некоторыми полями) в объеме, мы переписали запросы, чтобы сделать это следующим образом:

Update:

UPDATE ParentTable SET DeviceInformation = dual.DeviceInformation FROM ParentTable ptb 
    JOIN (values (1, 'info1'), (2, 'info2')) as dual (ParentTableID, DeviceInformation) 
    ON ptb.ParentTableID = dual.ParentTableID 

В Тот же идея для ВСТАВКИ:

INSERT INTO dbo.ChildTable 
     (ChildId, ChildNumber, Info) 
     values (1, 1, 'some text'), (2, 2, 'some text2') 

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

Надеюсь, это будет полезно.