>我可以使用什么连接字符串参数来改进
性能?我应该更改缓冲区大小吗?这可能是通过一个
连接字符串参数?是否有任何其他连接字符串
参数提高性能?我当前的连接字符串是:
Data Source=Batch.db;Version=3;Pooling=True;Max Pool
Size=10;Synchronous=off;FailIfMissing=True;Journal Mode=Off;
>我正在使用Dapper ORM. (由StackOverflow的人员构建)是否有更快的方式批量插入到.net中的sqlite?
> System.Data.sqlite用于插入到sqlite中.如何获得改进的sqlite的特殊编译版本
性能? sqlite的一个版本比另一个版本好吗?目前
使用System.Data.sqlite从http://sqlite.phxsoftware.com
>目前,我在一个事务中包装插入以使它们更快(这是一个很好的改进).
>我一次插入一张表中,共17张.我可以在不同的线程并行化这个,使这更快吗?
当前业绩.
这是典型的吗我能做得更好吗
> 55,000行到19列的表:2.25秒插入(24k插入/秒)
> 10,000行到63列的表:2.74秒插入(3.7k /秒)
我喜欢sqlite,但我希望使它更快一些.目前使用XML序列化将对象保存到XML文件中比将其保存到sqlite数据库更快,所以我的老板问:为什么要切换到sqlite?还是应该使用MongoDB或其他对象数据库?
解决方法
本文解释了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的表现.