空き領域の開放(VACUUM文)

SQLite のデータベースでファイルの追加や削除を繰り返していくと、格納されているデータの量に比例しないようなファイルのサイズになることがあります。ここでは SQLite で VACUUM 文を使って使用していない領域を解放する方法について解説します。

(Last modified: )

VACUUM文の使い方

SQLite でデータベースを作成するとファイルが 1 つ作成されテーブルや格納されたデータがファイルに保存されます。テーブルにデータを追加していくと次第にデータベースのファイルのサイズも大きくなっていきますが、テーブルからデータを削除してもすぐにデータベースのファイルのサイズが小さくなりません。ファイルの中で利用されていた領域はすぐに削除するのではなく次にデータが追加された時に再利用しようとするためです。

普段から気にする必要はありませんが、ファイルサイズが気になるようであれば VACUUM 文を実行することで使用していない領域を解放しファイルのサイズを小さくできる場合があります。

VACUUM 文は次のように実行します。

VACUUM;

VACUUM 文を実行するとデータベースの内容をテンポラリデータベースに一度移し、再度戻すという処理が行われます。この結果、空き領域を無くすと同時にデータを順番に格納しなおす作業が行われます。

注意点として VACUUM 文の対象となるのは main データベースのみです。アタッチしているデータベースがあったとしても VACUUM 文の対象とはなりません。また INTEGER PRIMARY KEY が設定されたカラムが無いテーブルの場合、格納されているデータに割り当てられた ROWID が変更されることがあります。

----

それでは実際に試してみます。 myfriend.sqlite3 データベースのファイルサイズは次のように 12,288 バイト となっています。

VACUM文の使い方(1)

myfriend.sqlite3 データベースに接続し、データベースからテーブルを1つ削除します。

VACUM文の使い方(2)

テーブルを削除した後でデータベースのファイルサイズを確認してみても、削除前と変わらず 12,288 バイト となっています。

VACUM文の使い方(3)

このようにテーブルやデータを削除してもすぐにデータベースのファイルサイズが小さくなるわけではありません。それではデータベースに接続し VACUUM 文を実行してみます。

vacuum;

VACUM文の使い方(4)

VACUUM 文を実行した後でデータベースのファイルサイズを確認してみると、8,192 バイト とファイルサイズが小さくなっていることが確認できます。(先程削除したテーブルの分だけではなく、これまでに削除したテーブルなどの分がまとめて解放されています)。

VACUM文の使い方(5)

このように VACUUM 文を実行することで、使用されていない領域を解放しファイルサイズを小さくすることができました。ファイルサイズが気になる場合などには試してみて下さい。

-- --

SQLite で VACUUM 文を使って使用していない領域を解放する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。