2014-05-09 28 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

是的,在数百万条记录中,我不得不调整我的批量大小。这很多都与我使用的重磅指数有关。我也尝试写入写入过程中可以锁定的只写表。然后我以大块的形式合并到读取的表中。它允许我以两种不同的速度推送数据。 –