Uso di SqlBulkInsert nelle applicazioni di produzione

bulkinsert c# database sql sqlbulkcopy

Domanda

Attualmente stiamo sviluppando un'applicazione che genera 5-10.000 righe di dati in una determinata tabella per ogni sessione utente. Attualmente stiamo usando i comandi di testo sql per inserire ogni riga di dati alla volta in modo che un'operazione di salvataggio possa richiedere fino a un minuto. Stiamo giocando con SqlBulkInserts e abbiamo visto il tempo scendere a meno di 500ms. Qualcuno ha obiezioni sull'uso di SqlBulkInserts in un'applicazione di produzione in cui molti utenti useranno il sistema?

Risposta accettata

Non ho mai avuto un problema con SqlBulkCopy con l'opzione set TableLock e un altro utente bloccato a causa di esso. L'opzione TableLock aumenta l'efficienza dell'inserto da quello di cui molte persone hanno parlato e mi ha mostrato semplicemente usarlo.

Il mio metodo tipico:

public void Bulk(String connectionString, DataTable data, String destinationTable)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        using (SqlBulkCopy bulkCopy =
            new SqlBulkCopy
            (
            connection,
            SqlBulkCopyOptions.TableLock |
            SqlBulkCopyOptions.FireTriggers |
            SqlBulkCopyOptions.UseInternalTransaction,
            null
            ))
        {
            bulkCopy.BatchSize = data.Rows.Count;
            bulkCopy.DestinationTableName = String.Format("[{0}]", destinationTable);
            connection.Open();
            bulkCopy.WriteToServer(data);
        }
    }
}

Risposta popolare

Prima di implementare l'utilizzo di SqlBulkInsert, prova a creare la tua query INSERT modo dinamico per assomigliare a questo:

insert into MyTable (Column1, Column2)
select 123, 'abc'
union all
select 124, 'def'
union all
select 125, 'yyy'
union all
select 126, 'zzz'

Questa sarà solo una chiamata al database, che dovrebbe essere eseguita molto più rapidamente. Per la concatenazione della stringa SQL, assicurarsi di utilizzare la classe StringBuilder .



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é