Итак, я наконец-то нашел способ высокопроизводительных массовых вставок в SQLite с использованием .NET.Этот прием улучшил производительность вставки в 4,1 раза!Мое общее время сохранения увеличилось с 27 до 6,6 секунд.Вот Это Да!
В этой статье описывается самый быстрый способ массовых вставок в SQLite .Ключ повторно использует те же самые объекты параметров, но для каждой записи, чтобы вставить, назначая различное значение.Время, которое требует .NET на создание всех этих объектов DbParameter, действительно складывается.Например, с 100 000 строк и 30 столбцов = 3 миллиона объектов параметров, которые должны быть созданы.Вместо этого создание и повторное использование только 30 объектов параметров выполняется намного быстрее.
Новая производительность:
55 000 строк (19 столбцов) за .53 секунды = 100 тыс. Вставок / секунду
internal const string PeakResultsInsert = @"INSERT INTO PeakResult values(@Id,@PeakID,@QuanPeakID,@ISTDRetentionTimeDiff)";
var command = cnn.CreateCommand();
command.CommandText = BatchConstants.PeakResultsInsert;
string[] parameterNames = new[]
{
"@Id",
"@PeakID",
"@QuanPeakID",
"@ISTDRetentionTimeDiff"
};
DbParameter[] parameters = parameterNames.Select(pn =>
{
DbParameter parameter = command.CreateParameter();
parameter.ParameterName = pn;
command.Parameters.Add(parameter);
return parameter;
}).ToArray();
foreach (var peakResult in peakResults)
{
parameters[0].Value = peakResult.Id;
parameters[1].Value = peakResult.PeakID;
parameters[2].Value = peakResult.QuanPeakID;
parameters[3].Value = peakResult.ISTDRetentionTimeDiff;
command.ExecuteNonQuery();
}
В итоге я не могу использовать Dapper для вставки в свои большие таблицы.(Для своих маленьких таблиц я все еще использую Dapper).
Обратите внимание, что я нашел еще кое-что:
Я пытался использовать несколько потоков для вставки данных в одинбазы данных, это не сделало никакого улучшения.(не имеет значения)
Обновлен с System.Data.Sqlite с 1.0.69 до 1.0.79.(ничего не изменилось в производительности, которую я мог видеть)
Я не назначаю тип для DbParameter, похоже, в любом случае разница в производительности не имеет значения.
Для чтения я не смог улучшить производительность Dapper.