SQLiteでレコードを削除してもファイルサイズが小さくならない場合の対処 †
SQLiteでレコードを削除(DELETE)してもファイルサイズは変わりません。
これは、削除したエリアをそのままにして再活用するためです。
従って、開いた(削除した)領域を開放するには、VACUUMというコマンドにより領域の開放を行わないといけません。
以下に例を記しながら説明します。
尚、操作はUbuntuで行いました。
関連記事 †
使用するデータベースファイルおよびデータ内容 †
使用するデータベースとデータ内容は以下の通りです。
- 使用するデータベースファイル名はtestdb.sqlite3になります。
サイズは4096バイトです。
sakura@ubuntu:~$ ls -l
合計 4
-rw-r--r-- 1 sakura sakura 4096 2月 7 10:47 testdb.sqlite3
- SQLite3を起動しテーブル名およびデーブル構成を確認しています。
SQLite version 3.7.9 2011-11-01 00:52:41
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
t1
sqlite> .schema t1
CREATE TABLE t1 (
a,
b,
c
);
sqlite> select count(*) from t1;
88
sqlite> .q
実際にレコード削除してみる †
- DELETEで全レコードを削除しました。
sakura@ubuntu:~$ sqlite3 testdb.sqlite3
SQLite version 3.7.9 2011-11-01 00:52:41
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> delete from t1;
sqlite> select count(*) from t1;
0
sqlite> .q
- ファイルサイズは変わっていません。
sakura@ubuntu:~$ ls -l
合計 4
-rw-r--r-- 1 sakura sakura 4096 2月 7 10:48 testdb.sqlite3
VACUUMコマンドを実行しファイルサイズを確認する †
vacuum;コマンドを実行したあとの結果です。
ファイルサイズが小さくなっているのが確認できます。
つまり空きエリアを開放したのが確認できました。
sakura@ubuntu:~$ sqlite3 testdb.sqlite3
SQLite version 3.7.9 2011-11-01 00:52:41
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> vacuum;
sqlite> .q
sakura@ubuntu:~$ ls -l
合計 4
-rw-r--r-- 1 sakura sakura 2048 2月 7 10:50 testdb.sqlite3
以上、SQLiteで削除してもファイルサイズが小さくならない場合の対処方法でした。