Androidアプリで大量Insertをやろうとしたのですが、数万件のInsertに10分ぐらいかかってしまったので、そのときの解決法。
結論から言うと、トランザクションを張っていないことが性能劣化の原因でした。
調べてみると、SQLiteはトランザクションを使わないと、SQL1つ実行するたびにトランザクション張ってコミットといったことをするそうで、そのためオーバーヘッドが大きくなりま。
(トランザクションの有り無しで速度が大体⒑倍ぐらい違いました)
参考までにトランザクションは以下のようなコードで張ることができます。
SQLiteDatabase db = mySQLiteOpenHelper.getWritableDatabase(); // SQLiteOpenHelper継承クラスのインスタンス db.beginTransactionNonExclusive(); db.execSQL("insert xxx"); // 何かしらテーブル操作 ... db.setTransactionSuccessful(); db.endTransaction();
SQLiteはトランザクションを張ると、そのデータベース自体がロックされます。
beginTransactionNonExclusiveだと書き込み禁止、読み込み可能なロック。
beginTransactionだと、読み書き禁止のロックとなります。