空き領域の開放(VACUUM文)
SQLiteのデータベースでファイルの追加や削除を繰り返していくと、格納されているデータの量に比例しないようなファイルのサイズになることがあります。ここではVACUM文を使って使用していない領域を解放する方法について解説します。
SQLiteでデータベースを作成するとファイルが1つ作成されテーブルや格納されたデータがファイルに保存されます。テーブルにデータを追加していくと次第にデータベースのファイルのサイズも大きくなっていきますが、テーブルからデータを削除してもすぐにデータベースのファイルのサイズが小さくなりません。ファイルの中で利用されていた領域はすぐに削除するのではなく次にデータが追加された時に再利用しようとするためです。
普段から気にする必要はありませんが、ファイルサイズが気になるようであればVACUM文を実行することで使用していない領域を解放しファイルのサイズを小さくできる場合があります。
VACUUM文は次のように実行します。
VACUUM;
VACUM文を実行するとデータベースの内容をテンポラリデータベースに一度移し、再度戻すという処理が行われます。この結果、空き領域を無くすと同時にデータを順番に格納しなおす作業が行われます。
注意点としてVACUUM文の対象となるのはmainデータベースのみです。アタッチしているデータベースがあったとしてもVACUUM文の対象とはなりません。またINTEGER PRIMARY KEYが設定されたカラムが無いテーブルの場合、格納されているデータに割り当てられたROWIDが変更されることがあります。
----
それでは実際に試してみます。現在使用しているデータベースのファイルサイズは次のように 9,216バイト となっています。
データベースからテーブルを1つ削除します。
テーブルを削除した後でデータベースのファイルサイズを確認してみても、削除前と変わらず 9,216バイト となっています。
このようにテーブルやデータを削除してもすぐにデータベースのファイルサイズが小さくなるわけではありません。それではVACUUM文を実行してみます。
vacuum;
VACUUM文を実行した後でデータベースのファイルサイズを確認してみると、8,192バイト とファイルサイズが小さくなっていることが確認できます。
VACUUM文を実行することで、使用されていない領域を解放しファイルサイズを小さくすることができました。ファイルサイズが気になる場合などには試してみて下さい。
( Written by Tatsuo Ikura )