sql >> Database teknologi >  >> RDS >> Mysql

Massekopier en datatabel til MySQL (svarende til System.Data.SqlClient.SqlBulkCopy)

Udelukk ikke en mulig løsning baseret på ubegrundede antagelser. Jeg har lige testet indsættelsen af ​​100.000 rækker fra en System.Data.DataTable ind i en MySQL-tabel ved hjælp af en standard MySqlDataAdapter#Update() inde i en Transaction . Det tog konsekvent omkring 30 sekunder at køre:

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();
            }
        }
    }
}

(Jeg prøvede et par forskellige værdier for UpdateBatchSize men de så ikke ud til at have en væsentlig indflydelse på den forløbne tid.)

I modsætning hertil bruger den følgende kode MySqlBulkLoader tog kun 5 eller 6 sekunder at køre ...

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);

... inklusive tiden til at dumpe de 100.000 rækker fra datatabellen til en midlertidig CSV-fil (ved hjælp af kode svarende til dette ), masseindlæsning fra den fil og sletning af filen bagefter.



  1. Sådan filtreres poster med samlet funktion COUNT

  2. Hvordan slår jeg validering af mysql-adgangskode fra?

  3. Hvordan bruger man COUNT i SQL?

  4. Sådan automatisk opdateres MySQL efter tidsstempelfeltet er udløbet