2009/05/16

SQLite Optimizer

ちょっと前にこんな事(FirefoxのProfileを縮小)を書きましたが、SQLiteにはVACUUM以外にもANALIZEとREINDEXという操作が可能な様です。
SQLite が認識する SQL - Third impact

VACUUM
実効データの格納に必要なサイズだけ確保し、*.sqliteファイルを縮小する
REINDEX
INDEXを再構築する
ANALYZE
INDEXの統計をとる

REINDEXとANALYZEの厳密な動作内容や、必要性(REINDEXの前後にANALYZEが要るのか?)は解りませんが、とりあえずVACUUM+REINDEXやっとけば動作が速くなるという話しです。

前回はサイズ圧縮が目的だったので、REINDEXはしていませんでしたが、早くなるのであればやった方がよさげです。 (ただ、VACUUMだけでも早くなったという話も見かけました)

SQLite Optimizer :: Firefox Add-ons
こちらを使うと、Profileフォルダの下の全*.sqliteファイルにVACUUMやREINDEXを一括処理をしてくれる様です。前回は一個一個手作業だったので非常に便利に。

スクリーンショットではREINDEXのみに見えますが、設定によりVACUUM+REINDEXに変更できるそうです。ただし、REINDEXがメインなので、VACUUMは(このアドオンで行う事は)あまり推奨していない様です。(miyafx: sqlite 最適化 - Firefox拡張機能)

また、SQLiteの仕様上、頻繁にVACUUMを行うのは逆効果との話。
sqliteのvacuum。auto_vacuum危険 — ありえるえりあ

こちら(VACUUM)を見る限りでは、vacuumとauto_vacuumの動作もバージョンによっては異なる様なので細かい挙動については、要調査ですが。

SQLite Optimizerの設定メニューにある「終了時に(略)実行する」というのは毎回ではなく、(about:configの)指定回数毎みたいです(デフォルト10回)。ただ、再起動もカウントされてしまうので、指定回数をトリガーにした上で、確認ダイアログを出すオプションなどがあれば尚嬉しいですね。

なにかのカスタマイズで頻繁に再起動しているときに、たまに再起動が遅くなるとエラーと勘違いしたり。急いでPCの電源を切りたい時に限って10回目に当ってしまった!なんて事もありそうです。