SqlBulkCopy è un trasferimento diretto, quasi byte-array, di dati di riga dal client a SQL Server. È facilmente il modo più efficiente per ottenere dati in SQL Server.
La sua prestazione si trova in operazioni veramente "di massa", tuttavia. Centinaia o migliaia di righe non sono necessariamente abbastanza alte da giustificare l'uso.Decine di migliaia o milioni di righe sono state le prestazioni di SqlBulkCopy brilleranno davvero. E, alla fine, tutto ciò di cui stiamo veramente parlando è ottenere i dati sul server.
Ci sono altre sfide significative nell'ottenere un set di righe nella tabella di un database di produzione. Reindirizzamento, riordino (se esiste un indice cluster), convalida della chiave esterna, tutti questi tipi di cose aggiungono tempo all'inserimento e sono potenzialmente bloccanti per tabelle e indici.
Inoltre, i dati TVP vengono scritti sul disco (come dati della tabella temporanea) e quindi sono accessibili per essere inseriti nelle tabelle. SqlBulkCopy è in grado di andare direttamente al tuo tavolo ... le prestazioni in quel caso sono significativamente più veloci, tuttavia, è necessario bilanciare la velocità per la concorrenza.
Penso che la regola generale sia, se si dispone di una manciata di righe da gestire, pensare a TVP e se si dispone di molte migliaia di righe, prendere in considerazione l'accesso a SQL Server il più rapidamente possibile tramite SqlBulkCopy.
fonte
2016-09-26 19:11:05
viene interrotto il collegamento –
@JonBarker - Ecco il link GitHub: https://github.com/matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs – DaveHogan
@DaveHogan Mi piace l'idea che hai qui. Stiamo seminando oltre 200.000 articoli ed è doloroso per non dire altro. Ho provato a inserirlo nel nostro seeding EF di repo, ma quando creo un elemento di Office che ha un oggetto figlio di dire Address, non creerà gli elementi figlio o la relazione. Questo tipo di cose è possibile o va oltre lo scopo del codice collegato? Grazie – Jon