Importa molti file xml

c# sqlbulkcopy sql-server-2008 xml

Domanda

Qual è l'approccio migliore per importare più file xml che sono in numero molto grande (es: 30000) con schema diverso per Sql Server 2008?

Attualmente sto SqlBulkCopy looping di ciascun file, caricando i dati su datatable e utilizzando SqlBulkCopy per inserire i dati, ma ci vuole molto tempo (circa 1,5 ore).

Risposta accettata

Questo non dovrebbe richiedere così tanto tempo. Secondo la mia stima, hai circa 600MB di dati; dovresti essere in grado di avvicinarti a 10MB / s o almeno 1MB / s senza troppe difficoltà - questo significa che 1-10 minuti dovrebbero essere facilmente ottenibili.

Cosa fare:

  • Identifica quale parte richiede tanto tempo
  • Fai una lista di possibili colli di bottiglia
  • Metti alla prova ogni teoria finché non trovi il colpevole
  • Implementare il workaround.

Senza ulteriori dettagli, è difficile essere precisi, ma posso ipotizzare:

  • SqlBulkCopy è in genere veloce, quindi il tuo inserimento non è probabilmente il collo di bottiglia. Potresti fare un po 'più veloce di un datatable, ma probabilmente non è un problema.
  • DataTable s può avere "indici"; cioè chiavi primarie e vincoli. Questi sono implementati in modo molto inefficiente - questi potrebbero sicuramente causare problemi.
  • Sebbene SqlBulkCopy sia veloce, è meglio con molte righe. Se stai copiando solo 1 file per SqlBulkCopy , ciò significa 30000 chiamate e probabilmente almeno 30000 fsyncs sul lato del database. Dovresti utilizzare solo un SqlBulkCopy .
  • Il tuo database potrebbe avere indici o vincoli sulle righe che hai inserito; e questi possono limitare severamente le prestazioni - controllare il carico del database.
  • la maggior parte dei lettori xml in .NET sono ragionevolmente veloci, ma 10 MB / s su un singolo thread potrebbero spingerlo. Se il tuo modello di accesso è particolarmente negativo (ad esempio, carica un XmlDocument completo e lo interroga con molti loop inefficienti e / o XPath) potresti riscontrare problemi di caricamento della CPU.
  • I file da 20 KB sono abbastanza piccoli. Se stai leggendo questi su un HDD, per ottenere solo 1 MB / s devi leggere 50 secondi, cioè con una latenza di 20 ms. Questo potrebbe essere un problema, in particolare se i file non sono posizionati in modo sequenziale sul disco. Parallelizzazione potrebbe aiutare un po ', ma un SSD aiuterà di più (e meglio sarebbe entrambi). Tuttavia, stai vedendo un rendimento molto inferiore a questo, quindi questo probabilmente non è il collo di bottiglia principale.

Con questo in mente, guarderei quanto segue in questo ordine

  • Carico del disco sul client (se il tempo di attesa del disco è elevato, considerare un SSD e la concorrenza)
  • Carico della CPU: profilo (analisi inefficiente o DataTable utilizzati in modo errato)
  • SqlBulkCopy : utilizzare solo una (per thread)
  • Caricamento del database (sbarazzarsi di tutti gli indici possibili, inclusi, se possibile, indici cluster)

L'ordine è ispirato da quanto sia difficile verificare questo problema. È improbabile che il carico del disco sia problematico, ma è banale da controllare, quindi si potrebbe iniziare eliminando questa possibilità. I problemi dello schema del database non sono improbabili, ma hanno molto più lavoro da identificare (quale indice è, e sto influenzando un altro flusso di lavoro rimuovendolo?), Quindi controllerei gli ultimi.



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é