Тайм-аут SqlBulkCopy в Azure

У нас возникла проблема с SqlBulkCopy в Azure.

Контекст следующий: у нас есть таблица примерно с 10 миллионами строк. В каждой строке около 15 столбцов.

Мы переносим эти данные в нашу новую модель, и для этого требуется разделить данные, чтобы 1 строка с 15 столбцами стала 15 строками.

Это работало отлично в начале. Теперь целевая таблица содержит 17 767 235 строк, и она выполняется довольно быстро.

В этот момент он начал генерировать исключения.

Я внес некоторые изменения, чтобы увеличить время ожидания и использовать пакет, но похоже, что он полностью заблокирован.

Вот оригинальное исключение:

Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
The statement has been terminated.; TraceSource 'WaWorkerHost.exe' event Services.DataMigration.Edmi_IN_0   5/9/2014 2:44 PM    2   1508    280

      at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlBulkCopy.RunParser(BulkCopySimpleResultSet bulkCopyHandler)
   at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsyncContinuedOnSuccess(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsyncContinued(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsync(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestContinuedAsync(BulkCopySimpleResultSet internalResults, CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestAsync(CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalAsync(CancellationToken ctoken)
   at System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32 columnCount, CancellationToken ctoken)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table, DataRowState rowState)

person Georges Legros    schedule 09.05.2014    source источник


Ответы (1)


SQL Azure очень хорошо защищает себя. Это приводит к троттлингу и даже к отключениям. Стандартные методы массового копирования с большим количеством данных обычно терпят неудачу. Я настоятельно рекомендую вам прочитать запись в блоге Александра Бризбуа о методах массового копирования Azure:

http://alexandrebrisebois.wordpress.com/2013/02/16/using-sqlbulkcopy-to-insert-massive-amounts-of-data-into-windows-azure-sql-database/

person CSharpRocks    schedule 10.05.2014
comment
На самом деле у меня теперь есть 121.021.968 записей в огромной таблице, о которой я говорил... Я предполагаю, что это основная причина, почему она очень медленно вставляется. - person Georges Legros; 12.05.2014
comment
Да, в миллионах записей мне приходилось корректировать размеры пакетов. Во многом это было связано с тяжелыми индексами, которые я использовал. Я также пытался писать в таблицы только для записи, которые я мог заблокировать в процессе записи. затем я слился с прочитанными таблицами кусками. Это позволило мне передавать данные на двух разных скоростях. - person Alexandre Brisebois; 04.06.2014