2014-05-09 13 views
5

Abbiamo un problema con SqlBulkCopy in Azure.Timeout su SqlBulkCopy in Azure

Il contesto è il seguente: Abbiamo una tabella con circa 10 milioni di righe. Ogni riga ha circa 15 colonne.

Stiamo migrando i dati nel nostro nuovo modello e questo richiede una divisione dei dati in modo che 1 riga con 15 colonne diventi 15 righe.

Ha funzionato perfettamente all'inizio. La tabella di destinazione ora contiene 17 767 235 righe ed è andata abbastanza veloce.

A questo punto, ha iniziato a generare eccezioni.

Ho apportato alcune modifiche per aumentare il timeout e utilizzare il batch ma sembra che sia completamente bloccato.

Ecco l'eccezione originale:

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) 

risposta

3

SQL Azure è molto bravo a proteggere se stessa. Ciò si traduce in strozzature e persino disconnessioni. Le tecniche di copia di massa standard con molti dati di solito falliscono. Mi raccomando di leggere post del blog di Alexandre Brisebois su Azure tecniche di copia di massa:

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

+0

Grazie per la condivisione di questo. Lavorerò sul mio codice usando questo. –

+0

In realtà ora ho 121.021.968 record sull'enorme tavolo di cui stavo parlando ... Suppongo che questo sia il motivo principale per cui è estremamente lento all'inserimento. –

+0

Sì, in milioni di record, ho dovuto modificare le dimensioni del batch. Molto di questo ha a che fare con gli indici pesanti che stavo usando. Ho anche provato a scrivere su tabelle di sola scrittura che potrei bloccare durante il processo di scrittura. poi mi sono fuso nei tavoli di lettura in blocchi. Mi ha permesso di spingere i dati a due velocità diverse. –