Sluit een mogelijke oplossing niet uit op basis van ongefundeerde aannames. Ik heb zojuist het invoegen van 100.000 rijen uit een System.Data.DataTable
. getest in een MySQL-tabel met behulp van een standaard MySqlDataAdapter#Update()
binnen een Transaction
. Het duurde constant ongeveer 30 seconden om te draaien:
using (MySqlTransaction tran = conn.BeginTransaction(System.Data.IsolationLevel.Serializable))
{
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.Connection = conn;
cmd.Transaction = tran;
cmd.CommandText = "SELECT * FROM testtable";
using (MySqlDataAdapter da = new MySqlDataAdapter(cmd))
{
da.UpdateBatchSize = 1000;
using (MySqlCommandBuilder cb = new MySqlCommandBuilder(da))
{
da.Update(rawData);
tran.Commit();
}
}
}
}
(Ik heb een aantal verschillende waarden geprobeerd voor UpdateBatchSize
maar ze leken geen significante invloed te hebben op de verstreken tijd.)
De volgende code daarentegen gebruikt MySqlBulkLoader
duurde slechts 5 of 6 seconden om te draaien ...
string tempCsvFileSpec = @"C:\Users\Gord\Desktop\dump.csv";
using (StreamWriter writer = new StreamWriter(tempCsvFileSpec))
{
Rfc4180Writer.WriteDataTable(rawData, writer, false);
}
var msbl = new MySqlBulkLoader(conn);
msbl.TableName = "testtable";
msbl.FileName = tempCsvFileSpec;
msbl.FieldTerminator = ",";
msbl.FieldQuotationCharacter = '"';
msbl.Load();
System.IO.File.Delete(tempCsvFileSpec);
... inclusief de tijd om de 100.000 rijen van de DataTable naar een tijdelijk CSV-bestand te dumpen (met code die lijkt op dit ), bulksgewijs laden uit dat bestand en het bestand daarna verwijderen.