Ответ 1
Поскольку я думаю, что будет плохая производительность, я не хочу писать DataTable в CSV файл и делать туда вставку с классом MySqlBulkLoader.
Не исключайте возможное решение, основанное на необоснованных предположениях. Я только что протестировал вставку из 100 000 строк из таблицы System.Data.DataTable
в таблицу MySQL, используя стандартный MySqlDataAdapter#Update()
внутри a 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 файл (используя код, похожий на этот), объемный - загрузка из этого файла и последующее удаление файла.