2016-04-21 53 views
2

嗨,我开发加载大量的线(约10K)一Xamarin应用性能差Sqlite.net扩展

我表现的东西真是可怜像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分钟+)。

我的对象包含关系船。

有什么方法可以优化吗?

回答

3

很难说没有看到实际的代码,但我面对可能影响性能的几个问题:

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

我认为你是正确的我必须重写我的逻辑为我的方案。 –

0

这里有一个建议:

尝试用原始查询,或实际,首先分析代码,也许在某处的一个瓶颈。

如果你什么也得不到,我想你就必须这样做异步,并有用户等待(或船舶数据库文件与您的应用

+0

我做,问题是在插入...当我使用的SQLite没有扩展方法,它实际上是快,但我失去了优势的扩展。运送数据库与应用程序不是一个选项,因为数据在后台设置,并修改很多时间 –

3

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

var journalMode = await globalConn.ExecuteScalarAsync<string>("PRAGMA journal_mode = wal"); 
+0

它略微提高但不显着:( –