高頻度でインサートし、一定期間が過ぎたものはデータが不要になるシステムの場合、定期的に不要データを掃除しないとぶくぶくデータサイズが膨れ上がる。組込型データベースの SQLite ではデータを SQL で DELETE
するだけでは物理削除されず、PostgreSQL のように VACUUM
する必要がある。
VACUUM
のバリエーションはいろいろあるものの、結論としては $ sqlite filename.db vacuum
とやるのが一番無難。
これまでは個人用途のしょうもないプログラムのためにしか使って来なかったため、スルーしていた SQLite の VACUUM 機能をメモ。
VACUUM の種類
SQLite の VACUUM
には大きく分けて vacuum と auto_vacuum の2つがある。
vacuum
http://sqlite.org/lang_vacuum.html
まずは vacuum から。vacuum はデータベースファイル全体に対して
- データベースページのパックや空き領域の開放
- デフラグメンテーション
などを行う
注意点
- データベースのリビルド前に既存のデータベースを一時ファイルにコピーするので、既存のDB以上のディスク空き容量が必要
- vacuum 後は rowid が変わることがある (
select rowid from table_name
で確認可能)
使い方
sqlite> vacuum;
auto_vacuum
http://sqlite.org/pragma.html#pragma_auto_vacuum
次に 3.1 以降(2005年リリース)から追加された auto_vacuum。
以下の3種類がある
- 0 : NONE(デフォルト。無効)
- 1 : FULL(トランザクションがコミットされるたびに、空きページをファイル末尾に移動して削除。デフラグやページの再構成は行わない)
- 2 : INCREMENTAL(VACUUMは自動では行わない。指定した数だけ空きページをファイル末尾に移動して削除。)
注意点
because it(=auto_vacuum) moves pages around within the file, auto-vacuum can actually make fragmentation worse.
http://sqlite.org/pragma.html#pragma_auto_vacuumusing auto_vacuum can lead to extra database file fragmentation. And auto_vacuum does not compact partially filled pages of the database as VACUUM does.
http://sqlite.org/lang_vacuum.html
使い方
auto_vacuum の種類は pragma で宣言する。
非常に重要な点として、テーブル作成後は auto_vacuum
をデフォルトの 0(None)
から変更できない。テーブルが auto_vacuum = NONE
の状態で作成されると auto_vacuum
は使えず、VACUUM
で頑張るしか無い。
auto-vacuuming must be turned on before any tables are created. It is not possible to enable or disable auto-vacuum after a table has been created.
http://www.sqlite.org/pragma.html#pragma_auto_vacuum
auto_vacuum = full
$ sqlite database.db sqlite> pragma auto_vacuum = full; sqlite> pragma auto_vacuum; 1
auto_vacuum = incremental
空きページは pragma incremental_vacuum(n)
で削除する。
$ sqlite database.db sqlite> pragma auto_vacuum=incremental; sqlite> pragma auto_vacuum; 2 ... sqlite> pragma incremental_vacuum(100);
空きページの調べ方
SQLite では使われていないデータベースページは freelist で管理されている。
A database file might contain one or more pages that are not in active use. Unused pages can come about, for example, when information is deleted from the database. Unused pages are stored on the freelist and are reused when additional pages are required.
http://sqlite.org/fileformat2.html#freelist
データベースのページ数、空きページ数は PRAGMA コマンド の page_count, freelist_count で取得できる
sqlite> PRAGMA freelist_count; 639 sqlite> PRAGMA page_count; 1091 sqlite> pragma incremental_vacuum(100); sqlite> PRAGMA freelist_count; 539 sqlite> PRAGMA page_count; 990
See Also
- [sqlite-users]How to determine when to VACUUM?
http://thread.gmane.org/gmane.comp.db.sqlite.general/57770/focus=57775 - Mozilla Firefox : Notes On SQLite Vacuum
https://wiki.mozilla.org/Firefox/Projects/Places_Vacuum - PostgreSQL : Introduction to VACUUM, ANALYZE, EXPLAIN, and COUNT
http://wiki.postgresql.org/wiki/Introduction_to_VACUUM,_ANALYZE,_EXPLAIN,_and_COUNT