2016-04-21 17 views
2

Hallo Ich entwickle eine Xamarin App, die viele Linien (etwa 10K) ladenSchlechte Leistung Sqlite.net Erweiterungen

I wie 2 Minuten wirklich schlechte Leistung etwas bekam 5K Linien eines Objekts einzufügen.

Ich benutze 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; 
     } 
    } 

Da ich hinzufügen "RunInTransaction" Ich habe eine Verbesserung bekam (bevor es 5 min + war).

Meine Objekte enthält Relationen Schiffe.

Gibt es eine Möglichkeit, das zu optimieren?

Antwort

3

Es ist schwer zu sagen, ohne den eigentlichen Code zu sehen , aber ich konfrontiert einige Probleme, die die Leistung beeinträchtigen können:

  • InsertOrReplace Leistung ist schlecht: Versuchen Sie rufen einfach Insert Aussagen statt InsertOrReplace. In einigen Szenarien kann dies große Auswirkungen haben.
  • SQLite.Net führt Einfügen Operationen nacheinander: dieser eine Komplex zur Problemumgehung, da es erfordert, dass Sie manuell einfügen Abfragen schreiben, um mehr als eine Einfügung auf jeder Anweisung auszuführen.
  • SQLite-Net-Erweiterung führt update Operationen nach Einsatz: Diese einfach zu umgehen, können Sie selbst Fremdschlüssel zuweisen und Klar SQLite.Net Insert auf Datenbank intensive Operationen aufrufen.
+0

Ich denke, Sie müssen meine Logik für mein Szenario neu schreiben. –

0

Hier ist ein Vorschlag:

Versuchen mit rohen Abfragen oder tatsächlich, zuerst den Code profilieren, vielleicht gibt es einen Engpass irgendwo da drin.

Und wenn Sie nichts bekommen, ich denke, Sie werden es nur async zu tun haben und Benutzer warten müssen (oder die Datenbankdatei mit Ihrer App versenden)

+0

Ich habe und das Problem ist in dem Einsatz ... Wenn ich keine Verwendung SQLite-Extension-Methode ist es wirklich schnell, aber ich verlor die Vorteile der Erweiterungen. Versand der Datenbank mit der App ist keine Option, da die Daten auf einem Backoffice festgelegt sind und viele Zeit ändern –

3

können Sie Insert die Leistung verbessern, indem Sie WAL Modus:

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

Es verbessert sich ein wenig, aber nicht signifikant :( –