2013年5月31日金曜日

[Android]AndroidのSQLiteはFULL AUTO VACUUM (auto_vacuum = 1)

普通(Android以外?)で利用するSQLiteでは、データ使用したデータ領域を開放しません。なので、delete/insertを繰り返すと、データが肥大化するため、フラグメンテーションを解消する必要があります。そのコマンドが、Vacuumです。 たとえば、日に1度データの入れ替えを行うために、全マスタをdeleteしてサーバから最新をとってinsertするというようなシステムでは、フラグメンテーションを解消しないと、性能的にも問題が発生する恐れがあります。そのため、Vacuumするのですが、先日TLを眺めていると「AndroidのSQLiteはauto vacuumだよー」的な発言が。。。 

「ウソだろ!」と思って、手元にある2.3系と4.2系で以下のようなコードで確認してみました。
コードはこんな感じ。


        DBHelper helper = new DBHelper(this);
        SQLiteDatabase database = helper.getReadableDatabase();
        Cursor cursor = database.rawQuery("PRAGMA auto_vacuum"null);

        cursor.moveToFirst();
        Log.d("tag""auto_vacuum = " + cursor.getString(0));


で、実行結果は2.3/4.2の両方とも
05-31 23:44:22.833: D/tag(19169): auto_vacuum = 1

auto_vacuum は0:NONE 1:FULL 2:INCREMENTALらしいです。そのため、自動的にVacuumされます。よってVacuumする必要はまったくありません。。。

参考情報はこの辺
http://tools.oesf.biz/android-2.3_r1.0/xref/external/sqlite/dist/Android.mk
http://tools.oesf.biz/android-2.3_r1.0/xref/external/sqlite/dist/sqlite3.c

0 件のコメント :