2014-05-09 26 views
5

Azure中的SqlBulkCopy存在問題。Azure中的SqlBulkCopy超時

上下文如下:我們有一個約1000萬行的表。每行有大約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) 

回答

3

SQL Azure是在保護自己很好。這會導致節流甚至斷開。具有大量數據的標準批量複製技術通常會失敗。我強烈建議你閱讀亞歷山大Brisebois的博客帖子大約Azure的批量複製技術:

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

+0

感謝分享此。我將使用這個工作來處理我的代碼。 –

+0

其實我現在在我說的巨大的桌子上有121.021.968條記錄...我會認爲這是插入時速度非常慢的主要原因。 –

+0

是的,在數百萬條記錄中,我不得不調整我的批量大小。這很多都與我使用的重磅指數有關。我也嘗試寫入寫入過程中可以鎖定的只寫表。然後我以大塊的形式合併到讀取的表中。它允許我以兩種不同的速度推送數據。 –