Come funziona SqlBulkCopy

.net sqlbulkcopy sql-server

Domanda

Conosco la classe C # SqlBulkCopy in cui è possibile chiamare il metodo 'WriteToServer' che passa attraverso un DataTable.

La mia domanda è quale meccanismo sottostante nel server SQL viene utilizzato per inserire in blocco quei dati?

La ragione per cui chiedo è che l'inserto di massa di riferimento nel file di Guida T-SQL di MSDN di Inserimento bulk richiede un file di dati da importare. SqlBulkCopy crea un file di dati?

Mi piacerebbe capire questa roba per capire se posso usare la funzionalità di inserimento di massa in SQL.

Se scrivo un'istruzione SQL che prepara tutte le righe da inserire in una tabella particolare (migliaia di righe) posso inserirle in massa nella tabella di destinazione? Qualcosa di simile è come lo sto facendo ora,

INSERT INTO sync_filters (table_name, device_id, road_id, contract_id)
    SELECT * FROM dbo.sync_contract_filters (@device_id)

E dbo.sync_contract_filters è una funzione per generare tutte le righe da inserire. Può essere inserito alla rinfusa?

Risposta accettata

SqlBulkCopy non crea un file di dati. Trasmette la tabella di dati direttamente dall'oggetto .Net DataTable al server utilizzando il protocollo di comunicazione disponibile (Named Pipes, TCP / IP, ecc.) E inserisce i dati nella tabella di destinazione in blocco utilizzando la stessa tecnica utilizzata da BCP .


Risposta popolare

SqlBulkCopy può utilizzare datatable, IDataReader o DataRow [] come origine dati. Dai un'occhiata ai metodi WriteToServer della classe. Ho trovato che è un meccanismo abbastanza utile per ottenere dati in SQL Server. L'ho usato in precedenza con CSVReader . Il link precedente ti dà un'idea di come funziona con una classe che implementa IDataReader.

Potrebbe essere necessario giocare con le dimensioni del batch per assicurarti di ottenere le prestazioni che ti aspetti.

La Guida alle prestazioni di caricamento dei dati su MSDN è una risorsa piuttosto utile se stai cercando di ottenere le migliori prestazioni dalla scrittura di grandi quantità di dati rapidamente. Si concentra maggiormente su cose come BCP e BULK INSERT, ma tocca SQLBulkCopy e fornisce anche un sacco di spunti di riflessione (forse un po 'troppo, ma è comunque un utile riferimento almeno).



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow