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)
Grazie per la condivisione di questo. Lavorerò sul mio codice usando questo. –
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. –
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. –