1

以下に説明するシナリオがあり、私の質問は次のとおりです。

  • これをより効率的にするにはどうすればよいですか?
    • テーブル構造を改善できますか?
    • クエリ/データ アクセスと書き込みを改善できますか?

現在、1 秒あたり約 100 個のオブジェクトを解析できます。

編集:「ケース 1:」に InsertHelper を追加することで、既存の値の速度が上がりました。これはほとんどの場合です。ただし、「last_insert_rowid()」が必要な場合の使用方法に関するリソースが見つかりません

データベース構造:

data {
  id integer primary key autoincrement
  name text not null
  ...
}

reference {
  id integer (same id as in table1, not unique here tho)
  source text not null
  source_id text not null
}

テーブル「参照」は、ソースとソースのIDからDBのIDへの参照を保持します。「データ」テーブルの各エントリには、「参照」テーブルに少なくとも 1 つのエントリがあります。

一度に 1 つのオブジェクトを解析して構築するストリーム内の JSON があります。ストリームは、8000 を超えるオブジェクトで最大数 MB になる場合があります。オブジェクトが構築されると、参照が含まれます。

構築された各オブジェクトについて、次のことを行います。

if(reference for this object does not exist){
  if(we find the object name in data)
    add to reference with the found id then break
  else
    add to data, get new id, add to reference then break
}

コードは次のようになります (読みやすくするために少し疑似コードを使用しています)。

beginTransaction();
try {
  while(parsing next object is successful){
    if("SELECT 1 FROM reference WHERE source = ? and source_id = ?" == null){
      Object[] objects = "SELECT * FROM data WHERE name = ?"
      switch(objects.length){
        case 0:
          "INSERT INTO data (name) VALUES(?)"
          "INSERT INTO reference  (id, source, source_id) VALUES (last_insert_rowid(), ?, ?)"
          break;
        case 1:
          "INSERT INTO reference  (id, source, source_id) VALUES (?, ?, ?)"
          break;
      }
    }
  }
  setTransactionSuccessful();
} finally {
  endTransaction();
}
4

2 に答える 2

0

SELECTまだルックアップ フィールドがない場合は、ルックアップ フィールドにインデックスを作成することで、クエリを高速化できます。

INSERTSQLコマンド (SQLiteDatabase.insertおよび)をラップするすべての関数は、挿入されたレコードの をInsertHelper.execute返します。rowid

于 2012-11-24T14:58:27.640 に答える