sql >> Databáze >  >> RDS >> Mysql

Hromadné zkopírování DataTable do MySQL (podobně jako System.Data.SqlClient.SqlBulkCopy)

Nevylučujte možné řešení založené na nepodložených předpokladech. Právě jsem testoval vložení 100 000 řádků z System.Data.DataTable do tabulky MySQL pomocí standardního MySqlDataAdapter#Update() uvnitř Transaction . Spuštění trvalo přibližně 30 sekund:

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

(Vyzkoušel jsem několik různých hodnot pro UpdateBatchSize ale nezdálo se, že by měly významný vliv na uplynulý čas.)

Naproti tomu následující kód používá MySqlBulkLoader spuštění trvalo pouze 5 nebo 6 sekund ...

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

... včetně času na uložení 100 000 řádků z DataTable do dočasného souboru CSV (pomocí kódu podobného jako toto ), hromadné načtení z tohoto souboru a následné smazání souboru.



  1. Rozšíření použití DBCC CLONEDATABASE

  2. Oracle:Jak zjistit, zda existuje nevyřízená transakce?

  3. Jump to Start Test-Driven Database Development (TDDD)

  4. Připojte se pomocí možnosti local-infile v MySql Workbench