2009-09-08 12 views
1

私はSQLite3を使用しているアプリを持っています。それはかなりうまく動いていますが、私はSQLite(書き込み)アクセスの高速化に関する提案をしたいと思います。データベース操作のほとんどは、トリプル(int、int、double)の数値を書きます。約20-50トリプル/秒です。時々読むことがありますが、鶏の歯ほどまれです(ほとんどの場合のみ積載時に発生します)。iPhoneでSQLite3を最適化

コードを最適化する(またはリース解除する)提案がありますか?私が見逃したSQLite3のショートカット(CoreDataを使用しているのは、プログラム内の他のもののためです。)

初期化中にステートメントst1を準備します。それはから準備される

const char *sql = "insert into historic values (?, ?, ?)"; 
if (sqlite3_prepare_v2(database, sql, -1, &st1, NULL) == SQLITE_OK) .... 

この準備は一度だけです。保存するために使用しているスニペットが下にあります(わかりやすくするため、ここでエラーチェックを削除しました)。

-(BOOL) saveHvalue:(int) fid time:(int) t value:(double) v type:(int) ftype 
{ 
    { 
     sqlite3_bind_int(st1, 1, fid); 
     sqlite3_bind_int(st1, 2, t); 
     sqlite3_bind_int(st1, 3, ftype); 

     sqlite3_step(st1); 
     sqlite3_reset(st1); 
     sqlite3_clear_bindings(st1); 
    } 

    return YES; 
} 

答えて

8

トランザクションで書き込みをバッチ処理していますか?これだけで大丈夫です。 1回のトランザクションでそれらをすべてバッチすることはできません。ジャーナルは巨大ですが、500〜1000回の挿入で1回のトランザクションでコードが大幅にスピードアップします。

+0

。ありがとう。 –

+0

これは私のスピードを大きさのオーダーで改善しました!!ありがとう! –

+0

もちろん、一度に500レコードを処理して50 /秒を挿入すると、クラッシュ時に最大10秒のデータが失われます(ジャーナルにあるコミットされていないトランザクションはロールバックされると思います)。これはおそらくあなたのアプリにとって大きな問題ではないかもしれません。 – lapo

0

historicのいずれかの列にインデックスがありますか?もしそうなら、インデックスを削除し、あなたのものを挿入してからインデックスを再追加する方が一般的に速いです(一度にたくさん追加する場合)。

+0

インデックスを作成しているすべてがPKの場合は、インデックスを作成する必要はありません(データベースが非常に重いので、インデックスは必要ありません) –

+0

主キーは(fid、t) 。 –

0

通常は通常スレッドに返信することはありませんが、これは私にとって驚異的でした(他の地域で最適化しようとした日の後)!

基本的に私はインサートのループのための私を包んだ:私はそれを試してみましょう

sqlite3_exec(db, "BEGIN", 0, 0, 0); 

for() { 
-- inserts -- 
} 

sqlite3_exec(db, "COMMIT", 0, 0, 0); 
+1

ええ、それは@パウロの答えで言及された "取引"です。 –