sql >> データベース >  >> RDS >> Mysql

DataTableをMySQLに一括コピーします(System.Data.SqlClient.SqlBulkCopyと同様)

    根拠のない仮定に基づいて考えられる解決策を除外しないでください。 System.Data.DataTableからの100,000行の挿入をテストしました 標準のMySqlDataAdapter#Update()を使用してMySQLテーブルに Transaction内 。実行には一貫して約30秒かかりました:

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

    UpdateBatchSizeにいくつかの異なる値を試しました ただし、経過時間に大きな影響はないようです。)

    対照的に、MySqlBulkLoaderを使用する次のコード 実行に5〜6秒しかかかりませんでした...

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

    ... DataTableから一時CSVファイルに100,000行をダンプする時間を含みます(これ )、そのファイルから一括読み込みし、後でファイルを削除します。



    1. データベース接続は常に開いたままにする必要がありますか、それとも必要な場合にのみ開く必要がありますか?

    2. MySQLは、別のテーブルの列の合計に基づいてフィールドを更新するようにトリガーします

    3. OracleストアドプロシージャのASとISの違いは何ですか?

    4. PerconaLiveDublin-イベントのまとめとセッション