2

您好我正在开发一个加载大量行(大约 10K)的 Xamarin 应用程序

我的性能真的很差,比如 2 分钟插入一个对象的 5K 行。

我使用 InsertOrReplaceWithChildren:

 public  bool Insert_Update_Many<T>(List<T> obj)
    {
        try
        {
            lock (this.Lock) {
                _connection.RunInTransaction(() => {
                    _connection.InsertOrReplaceAllWithChildren(obj, true);
                });
            }
            return true;
        }
        catch (Exception ex)
        {
            Debug.WriteLine("[SQLITE_ERROR]: " + ex.ToString());
            return false;
        }
    }

由于我添加了“RunInTransaction”,我得到了改进(在 5 分钟之前)。

我的对象包含关系船。

有什么办法可以优化吗?

4

3 回答 3

3

没有看到实际代码很难判断,但我遇到了一些可能影响性能的问题:

  • InsertOrReplace性能很差:尝试调用简单Insert语句而不是InsertOrReplace. 在某些情况下,这可能会产生很大影响。
  • SQLite.Net 一个一个地执行插入操作:这是一个复杂的解决方法,因为它需要您手动编写插入查询以在每个语句上执行多个插入。
  • SQLite-Net Extensionsupdate在插入后执行操作:这很容易解决,您可以自己分配外键并Insert在数据库密集型操作上调用普通的 SQLite.Net。
于 2016-04-21T15:57:51.630 回答
3

您可以通过使用WAL模式来提高插入性能:

 var journalMode = await globalConn.ExecuteScalarAsync<string>("PRAGMA journal_mode = wal");
于 2016-04-21T16:38:41.573 回答
0

这里有一个建议:

尝试使用原始查询,或者实际上,首先分析代码,也许那里存在瓶颈。

如果你什么也没得到,我想你只需要异步执行并让用户等待(或将数据库文件与你的应用程序一起发送

于 2016-04-21T15:49:28.503 回答