MySqlDataAdapter o MySqlDataReader per il trasferimento di massa?

mysql sqlbulkcopy sql-server

Domanda

Sto usando il connettore MySql per .NET per copiare i dati dai server MySql a SQL Server 2008.

Qualcuno ha avuto prestazioni migliori usando uno dei seguenti, rispetto all'altro?

  • DataAdapter e chiamata Riempi a un DataTable in blocchi di 500
  • DataReader. Leggi un DataTable in un loop di 500

Sto quindi utilizzando SqlBulkCopy per caricare le 500 righe DataTable, quindi continuare il ciclo fino a quando il set di record MySql non viene trasferito completamente.

Mi preoccupo principalmente di usare una quantità ragionevole di memoria e di completarla in un breve lasso di tempo.

Qualsiasi aiuto sarebbe apprezzato!

Risposta accettata

Ho usato SqlBulkCopy con DataReader durante l'elaborazione di grandi quantità di dati. Ho trovato il processo abbastanza efficiente in termini di velocità e utilizzo della memoria, poiché l'intero set di dati non viene recuperato prima della copia. Raccomando di impostare la proprietà BatchSize su un valore ragionevole, ad esempio 500 nel tuo caso.


Risposta popolare

Non ho usato SqlBulkCopy, ma come regola generale, i DataReader in genere offrono prestazioni migliori.

Un DataReader può essere elaborato mentre la query sottostante sta ancora restituendo i record (quindi non è necessario attendere il termine della query prima di poter iniziare l'elaborazione dei dati). Un DataReader restituirà i dati non appena sarà disponibile e credo che memorizzerà solo il record attivo in memoria per impostazione predefinita (non il set di risultati completo), riducendo così l'utilizzo della memoria.

Un DataAdapter carica il set di risultati completo in un DataTable / DataSet che avrà un overhead superiore a causa del modo in cui le informazioni vengono memorizzate nella memoria e dello stato associato aggiuntivo (si pensi allo stato delle righe, ecc.).

Se sto solo leggendo i dati, userò sempre un DataReader su un DataAdapter ... qualcuno mi corregga se ho torto su un punto qualsiasi?

Indipendentemente da ciò, SqlBulkCopy sembra solo scorrere i record e non usa il DataTable per nessuna ottimizzazione (secondo Reflector), quindi penso che DataReader sia la soluzione migliore.



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é