.net – 使用Dapper ORM提高SQLite批量插入的性能
我正在使用一个桌面应用程序,它使用SQLite将数万行批量插入SQLite数据库.我想帮助优化批量插入性能.目前需要长达50秒的时间将60兆的数据插入数据库.
>我可以使用什么连接字符串参数来改进
>我正在使用Dapper ORM. (由StackOverflow的人员构建)是否有更快的方式批量插入到.net中的Sqlite? 当前业绩. > 55,000行到19列的表:2.25秒插入(24k插入/秒) 我喜欢SQLite,但我希望使它更快一些.目前使用XML序列化将对象保存到XML文件中比将其保存到SQLite数据库更快,所以我的老板问:为什么要切换到SQLite?还是应该使用MongoDB或其他对象数据库? 解决方法
所以我终于找到了使用.NET在SQLite中高性能批量插入的技巧.这个技巧将插入性能提高了4.1倍!我的总节省时间从27秒到6.6秒.哇!
本文解释了fastest way to do bulk inserts into SQLite.关键是重用相同的参数对象,但是要为每个记录插入,分配一个不同的值. .NET构建所有这些DbParameter对象的时候真的加起来了.例如,100k行和30列= 300万个必须创建的参数对象.相反,创建和重用只有30个参数对象要快得多. 新表演: > 55,000行(19列).53秒= 100k插入/秒 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的表现. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |