以下に説明するシナリオがあり、私の質問は次のとおりです。
- これをより効率的にするにはどうすればよいですか?
- テーブル構造を改善できますか?
- クエリ/データ アクセスと書き込みを改善できますか?
現在、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();
}