Firefox SQLiteデータベースのVACUUMについて

またこの話か。というかFirefoxのパフォーマンスネタは定期的に挙がりますねw

Twitter上でいくつかやり取りしたけど、僕の考えは以下の通り。

SQLiteのVACUUMは論理データをエクスポートしてインポートし直すような処理。当然データ配置が変る。そうすると、その索引は全く別の行を指し示してしまうかもしれないので無意味な索引になる。VACUUMは対象テーブルに付く索引もセットで再構成されると予想

http://twitter.com/teramako/status/13823980384

なので、REINDEXはやらなくても良いと思っている。ただ、その後VACUUMとVACUUM+REINDEXではファイルのサイズが変化したという報告を頂いているので、REINDEXまでやった方が丁寧なのもしれない。

あ、そうそう、

念のためfirefoxが起動している時には行なわない。

places.sqliteFirefox起動中は排他ロックが掛かっているので、起動中にsqlite3コマンドなどからアクセスすることは出来ないはず(Firefox内部の特定のXPCOMからのみアクセス可能)。なので、『念のため』ではなく必要用件としてfirefoxは起動している状態ではいけない

なぜか一言も言及されてないけど、

Firefox3.6だったか3.5だったかで、places.sqliteはPCがアイドル時にVACUUMする処理が入っているはず。
(誰かバグ番号教えてください><)
Bug 512854 – VACUUM places.sqlite database on daily idle once a monthだそうです*1
ちょっと勘違いされたかもですが、ステータスがRESOLVED FIXEDとなっています。Mercurial上ではmozilla-1.9.2: changeset 31871:7b4f35e3a442になります。

なので単純にVACUUMしますよ的なアドオンは今は無意味になったと思う。

参考情報

どうでも良いが、DBの再編成のことを「最適化」と呼ぶのは好きじゃない。再編成が最も適した状態になるか保障できないからね。

*1:コメント欄参照