Mysql
 sql >> база данни >  >> RDS >> Mysql

Групово копиране на DataTable в MySQL (подобно на System.Data.SqlClient.SqlBulkCopy)

Не изключвайте възможно решение, основано на необосновани предположения. Току-що тествах вмъкването на 100 000 реда от System.Data.DataTable в MySQL таблица с помощта на стандартен MySqlDataAdapter#Update() вътре в 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);

... включително времето за изхвърляне на 100 000 реда от DataTable във временен CSV файл (използвайки код, подобен на това ), групово зареждане от този файл и изтриване на файла след това.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL - код на грешка 1005 с номер на грешка 121

  2. Настройка на отдалечена връзка с MySQL база данни

  3. MySQL ИЗПУСКА всички таблици, игнорирайки външните ключове

  4. Създаване на MySQL пространствена колона - Тип данни на точка с lat long без използване на таблицата Alter

  5. A.* не е в GROUP BY с ляво присъединяване в конструктора на заявки за laravel