このエントリーをはてなブックマークに追加


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で削除してもファイルサイズが小さくならない場合の対処方法でした。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-03-20 (金) 22:08:00