dimensione del batch di massa che interessa l'inserto

c# database datatable sqlbulkcopy sql-server

Domanda

Sto usando un SqlBulkCopy per inserire il contenuto di un datatable di un milione di record (ogni record ha circa 10 colonne) in una tabella di database. Vedo alcuni valori instabili per la durata della copia di massa mentre cambio la proprietà della dimensione batch ( bulkCopy.BatchSize ).

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn.ConnectionString, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.UseInternalTransaction | SqlBulkCopyOptions.CheckConstraints))
{
    bulkCopy.DestinationTableName = destinationTableName;
    bulkCopy.BatchSize = 100000;
    bulkCopy.BulkCopyTimeout = 1800;
    if (matchingColumns != null || matchingColumns.Count > 0)
    foreach (KeyValuePair<string, string> kv in matchingColumns)
        bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(kv.Key, kv.Value));
    bulkCopy.WriteToServer(dt);
}

Quando non ho usato le dimensioni del batch, il processo è stato eseguito in 7 minuti. Quindi ho impostato la dimensione del lotto su 100.000 e il tempo era intorno alle 5:30, quindi l'ho impostato su 50.000 e il tempo è aumentato a 10 minuti.

Vorrei sapere l'effetto della dimensione del batch sulla velocità INSERT. In generale, rende le cose più veloci o più lente?

Risposta accettata

Dai un'occhiata a questo whitepaper che verifica ampiamente le dimensioni del batch:

SQLBulkCopyPerformance

Vi sono molti dati in merito all'utilizzo della rete, ecc. Utilizzando dimensioni di lotti diverse, ma la conclusione è la seguente:

Non abbiamo trovato nulla di menzionato nella Books OnLine né abbiamo mai visto nulla di interessante durante la nostra esperienza, questo ci ha portato a dire che la cosa migliore da fare con BatchSize è di lasciarlo a zero, che è il suo valore predefinito, dal momento che qualsiasi valore diverso da quello diminuirà le prestazioni del processo di caricamento

Che sembra essere d'accordo con i tuoi test.

MODIFICARE:

Ogni volta che ho usato SqlBulkCopy in passato, tendo a controllare personalmente la dimensione del batch eseguendo più inserti, quindi solo la proprietà NotifyAfter e l'evento SqlRowsCopied per ottenere gli aggiornamenti di avanzamento man mano che la copia avanza.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché