4

親愛なる開発者の皆様、何らかの理由で、1720 レコードの更新は、SSD ディスク上で (特にトリムが有効になっている場合) 約 15 秒かかります。

次のドキュメントを使用して sqlite 設定を微調整しました (これはうまく機能します) http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html

パフォーマンスを最適化するために次の PRAGMA のセットがあり、更新の完全なセットでトランザクションを使用します。

sqlite3_exec(database, "PRAGMA cache_size=500000;", nil, nil, nil);
sqlite3_exec(database, "PRAGMA synchronous=OFF", nil, nil, nil);
sqlite3_exec(database, "PRAGMA count_changes=OFF", nil, nil, nil);
sqlite3_exec(database, "PRAGMA temp_store=MEMORY", nil, nil, nil);

SSD の処理が多すぎるため (ブロックの削除など)、単純なレコードの更新が 1720 回だけで 15 秒間ブロックされているようです。

奇妙なことに、2500 レコードの挿入はほぼ瞬時に行われます。これを修正する方法を教えてください。

4

1 に答える 1

4

古き良きテストを行って試してみることで、答えを見つけました。トランザクションで多数の単一の UPDATE ステートメントを次々に実行すると、TRIM を使用する SSD で sqlite がフリーズするようです。

ここでコードを変更しました。a) コマンドを準備し、更新されるすべてのレコードに対してそのコマンドを再利用します。b) 1500 レコードごとに新しいトランザクションを COMMIT して BEGIN する

これにより、sqlite のフリーズが修正されたようです。つまり、準備された sql ステートメントを再利用し、トランザクションが大きくなりすぎないようにします。

于 2011-06-06T07:37:58.277 に答える