Массовая копия DataTable в MySQL (аналогично System.Data.SqlClient.SqlBulkCopy)
Я переношу свою программу с Microsoft SQL Server на MySQL. Все работает хорошо, кроме одной проблемы с массовой копией.
В решении с MS SQL код выглядит так:
connection.Open(); SqlBulkCopy bulkCopy = new SqlBulkCopy(connection); bulkCopy.DestinationTableName = "testTable"; bulkCopy.WriteToServer(rawData);
Теперь я пытаюсь сделать что-то подобное для MySQL. Поскольку я думаю, что будет плохая производительность, я не хочу писать DataTable в CSV-файл и делать туда вставку с classом MySqlBulkLoader
.
- PG неопределенное отношение к ошибкам пользователей не существует
- Весенняя партия Работа, считанная из нескольких источников
- Перенос базы данных из Postgres в MySQL
- Разница между ключом раздела, составным ключом и ключом кластеризации в Cassandra?
- Резервное копирование / восстановление Android: как создать резервную копию внутренней базы данных?
Любая помощь будет высоко оценен.
- дизайн схемы базы данных streamов сообщений
- Как сжать / очистить файл ibdata1 в MySQL
- Что такое использование BaseColumns в Android?
- Плагин аутентификации 'caching_sha2_password' не может быть загружен
- попытка повторного открытия уже закрытого объекта: SQLiteDatabase
- Хранение данных в MySQL как JSON
- Экспорт базы данных MySQL в базу данных SQLite
- Запрос, если firebase database Android существует!
Поскольку я думаю, что будет плохая производительность, я не хочу писать DataTable в CSV-файл и делать туда вставку с classом MySqlBulkLoader.
Не исключайте возможное решение, основанное на необоснованных предположениях. Я просто протестировал вставку из 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-файл (с использованием кода, подобного этому ), массовую загрузку из этого файла и последующее удаление файла.