空き領域の開放(VACUUM文)

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

(Last modified: )

VACUUM文の使い方

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

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

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

VACUUM;

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

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

----

それでは実際に試してみます。現在使用しているデータベースのファイルサイズは次のように 49,152 バイト となっています。

VACUM文の使い方(1)

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

VACUM文の使い方(2)

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

VACUM文の使い方(3)

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

vacuum;

VACUM文の使い方(4)

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

VACUM文の使い方(5)

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

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。