2

こんにちは、たくさんの行 (約 10K) をロードする Xamarin アプリを開発しています。

オブジェクトの 5,000 行を挿入するのに 2 分程度の非常にパフォーマンスが低下しました。

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

WALモードを使用すると、挿入のパフォーマンスを向上させることができます。

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

実際のコードを見ないとわかりませんが、パフォーマンスに影響する可能性のあるいくつかの問題に直面しました。

  • InsertOrReplaceパフォーマンスが悪いInsert:の代わりに単純なステートメントを呼び出してみてくださいInsertOrReplace。シナリオによっては、これが大きな影響を与える可能性があります。
  • SQLite.Net は挿入操作を 1 つずつ実行します。これは、各ステートメントで複数の挿入を実行するために手動で挿入クエリを記述する必要があるため、回避策が複雑です。
  • SQLite-Net 拡張機能はupdate、挿入後に操作をInsert実行します。これは簡単に回避できます。自分で外部キーを割り当てて、データベース集中操作でプレーンな SQLite.Net を呼び出すことができます。
于 2016-04-21T15:57:51.630 に答える
0

ここに提案があります:

生のクエリを試すか、実際には最初にコードをプロファイリングします。おそらくどこかにボトルネックがあるでしょう。

そして、何も得られない場合は、非同期にしてユーザーを待たせる必要があると思います(または、アプリでデータベースファイルを出荷します

于 2016-04-21T15:49:28.503 に答える