Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Massenkopieren einer DataTable in MySQL (ähnlich wie System.Data.SqlClient.SqlBulkCopy)

Schließen Sie eine mögliche Lösung nicht aufgrund unbegründeter Annahmen aus. Ich habe gerade das Einfügen von 100.000 Zeilen aus einer System.Data.DataTable getestet in eine MySQL-Tabelle mit einem standardmäßigen MySqlDataAdapter#Update() innerhalb einer Transaction . Die Ausführung dauerte durchgehend etwa 30 Sekunden:

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

(Ich habe ein paar verschiedene Werte für UpdateBatchSize ausprobiert aber sie schienen keinen signifikanten Einfluss auf die verstrichene Zeit zu haben.)

Im Gegensatz dazu verwendet der folgende Code MySqlBulkLoader dauerte nur 5 oder 6 Sekunden, um zu laufen ...

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

... einschließlich der Zeit, um die 100.000 Zeilen aus der DataTable in eine temporäre CSV-Datei zu kopieren (unter Verwendung eines ähnlichen Codes wie dies ), Massenladen aus dieser Datei und anschließendes Löschen der Datei.