# 理屈をよく分かって書いているわけではありませんが

5か月ほどspamの処理ができていなかったために、データベースが異様に肥大し、200MBを超えるようになりました(中略)管理画面からspamを削除したのですが、それでも一度大きくなったSQLiteのデータファイルは小さくならないようで、MTが異様に重くなっています。(中略)さて、どうしたら解決できるでしょうか。

あー。確かに。
このご時世、多少なりともトラフィックあるブログが5ヶ月もほっとかれたら、
どんな悲惨なことになるか、容易に想像が付く…

僕も、SPAMを消したり、再構築したり、
なんやかやとしてるんで、多分だいぶゴミが付いてると思うんだよね。
一度スッキリさせてみたい。

で、松永さんのダイアリの方に、
有効そうなコメントが付いてたので、それを参考にしてやってみました。

そのコメントとは、以下の通り。

Ctrans
『>一度大きくなったSQLiteのデータファイルは小さくならないようで
sqliteのvacuumを使えば、ファイルサイズを小さくできます(少なくとも削除したspamの分)。
MTのことはよく分かりませんが、sqliteのデータベースファイルをダウンロードして、TkSQLite(
http://reddog.s35.xrea.com/wiki/TkSQLite.html)でそのDBファイルを開き、「データベース」メニューからvacuumを実行するのが手軽でいいと思います。』

TKSQLiteってのは、まぁ、SQLiteの管理ツールのようなものらしい。

まず、WEBからDBファイルをダウンロードしてきて、
次に上のツールをダウンロード(インストールは解凍のみ)。

『ファイル』 - 『開く』から、DBファイルを選択し、開く。
次に、『データベース』 - 『VACUUM』を選択。

上のような警告が出るので、OKを押すと処理が始まり、程なく終了。
14MB強のDBを処理するのに掛かった時間は、だいたい10秒くらい。

結果。

おー大体、14%程度の削減に成功。
まぁ元々がそうでかくないから、あんまり変わらないのかもしれないけど。
仮に200MBのDBで14%削減ならでかいんでは。

『最適化』にしては、いい出来何じゃないかなーって感じ。
処理のDBファイルを戻しても、問題なく動いてるし。

一番上に書いてるとおり、理屈が分かってるわけではないので、
オススメまでは出来ませんけど。

参考:

SQLite が認識できるクエリー言語 - VACUUM

SQLステートメント ::= VACUUM [インデックスまたはテーブル名]

VACUUM コマンドは PostgreSQL における同様のコマンドをモデルにした SQLite の拡張機能です。VACUUM がテーブルまたはインデックス名を伴って実行されると、指定されたテーブルまたはインデックスを整理するものと見なします。 SQLite のバージョン 1.0 では VACUUM コマンドは gdbm_reorganize() を呼び出してバックエンドのデータベースファイルを整理します。