使用Dapper ORM提高SQLite批量插入的性能

Bro*_*ing 10 .net sqlite dapper

我正在开发一个桌面应用程序,它使用SQLite将数万行批量插入SQLite数据库.我想帮助优化批量插入性能.目前,将60兆位的数据插入数据库需要50秒.

  • 我可以用什么连接字符串参数来提高性能?我应该更改缓冲区大小吗?这可以通过连接字符串参数吗?是否有其他连接字符串参数可以提高性能?我当前的连接字符串是:

    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的一个版本比另一个版本好吗?目前正在使用http://sqlite.phxsoftware.com上的 System.Data.SQLite

  • 目前,我在事务中包装插入以使它们更快(这是一个很好的改进).

  • 我一次插入一张表到17张表.我可以在不同的线程上并行化这个并使其更快吗?

目前的表现. 这是典型的吗?我可以做得更好吗?

  • 表格中有55,000行,包含19列:插入2.25秒(24k插入/秒)
  • 表格中有10,000行到63列:插入2.74秒(3.7k /秒)

我喜欢SQLite,但我希望能让它快一点.目前使用XML序列化将我的对象保存到XML文件比保存到SQLite数据库要快,所以我的老板问:为什么要切换到SQLite?或者我应该使用MongoDB还是其他一些对象数据库?

Bro*_*ing 14

所以我终于找到了使用.NET在SQLite中进行高性能批量插入的技巧.这个技巧将插入性能提高了4.1倍!我的总节省时间从27秒增加到6.6秒.哇!

本文介绍了批量插入SQLite最快方法.关键是重用相同的参数对象,但要为每个记录插入,分配不同的值..NET构建所有这些DbParameter对象的时间确实增加了.例如,100k行和30列= 300万个必须创建的参数对象.相反,创建和重用仅30个参数对象要快得多.

新表现:

  • 在.53秒内55,000行(19列)= 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();
                }
    
    Run Code Online (Sandbox Code Playgroud)

最终我无法使用Dapper插入我的大表.(对于我的小桌子,我仍然使用Dapper).

请注意,我发现的其他一些事情:

  • 我尝试使用多个线程将数据插入到同一个数据库中,这没有任何改进.(没有区别)

  • 从System.Data.Sqlite 1.0.69升级到1.0.79.(在我看到的表现上没有什么不同)

  • 我没有为DbParameter分配一个Type,它似乎不会产生任何性能差异.

  • 对于读取,我无法改善Dapper的性能.