sql >> Database >  >> RDS >> Mysql

Kopieer een DataTable in bulk naar MySQL (vergelijkbaar met System.Data.SqlClient.SqlBulkCopy)

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.



  1. Hoe de Oracle-database te controleren op langlopende query's

  2. SQL Server-fout Impliciete conversie van omdat de sortering van de waarde niet is opgelost vanwege een sorteerconflict.

  3. MYSQL-syntaxis evalueert niet niet gelijk aan in aanwezigheid van NULL

  4. Perl DBI voegt meerdere rijen in met behulp van mysql native multiple insert-mogelijkheid