2009年3月2日月曜日

sqlite 最適化 - Firefox拡張機能


sqlite 最適化 - Firefox拡張機能
Firefox 3.0.0 - 3.5 用
Ver. 0.7 ( 2009/08/25 )

Firefoxプロファイルフォルダ直下にある *.sqlite データベースの最適化を行います。
※ Firefox 3.5 からは places と cookie の db が常時ブラウザに掴まれているようなので、この拡張では最適化できません。
これらの db を最適化したい場合は他サイトで紹介されている sqlite3.exe 等を使った方法をご利用ください。

10回終了のたびに問答無用で vacuum するのもどうかと思い始めているところです。
PRAGMA freelist_count と PRAGMA page_count の比率が 20% を超えたらreindex と vacuum を実行し、それ以下なら reindex だけ実行しようかと思案中。。。。

最適化のタイミング:
自動または手動
自動の場合は Firefox を10回終了するたびに1度最適化を実行します( about:config で変更可 )。
sqlite_opt.auto_reindex_per_browser_close (デフォルト 10)

最適化の方法:
/>> Ver. 0.1
各 sqlite データベースに対して REINDEX を実行します( about:config で VACUUM に変更可 )。
sqlite_opt.use_vacuum_instead_reindex ( デフォルト false )
※ 0.6 以降は設定画面で設定可能。

/>> Ver. 0.2
Reindex のみ(デフォルト)。
Vacuum 後 Reindex 。
選べるようにしました。
これにともない sqlite_opt.use_vacuum_instead_reindex は廃止。
sqlite_opt.vacuum_before_reindex ( デフォルト false )
を新設。

/>> Ver.0.5
Firefox 3.5 に対応しました。
エラー処理が甘々だったのを改善。

/>> Ver.0.5.1
突然 FF 3.5.1 がリリースされたので、install.rdf のみ修正して、再度アップしました。

/>> Ver.0.6
1. places.sqlite の vacuumとreindex に対応しました。(asmさんありがとうございます)
2. 「reindex 前に vacuum」 を設定画面から指定できるようになりました。

/>> Ver.0.7
1. FF 3.0.* で places が vacuum/reindex 出来なくなっていたのを修正。
2. フラグメント(データベースの未使用領域)が 20% 未満の場合は vacuum が指定されていても vacuum をスキップして、reindex のみ行うようにしてみました。

32 コメント:

TOPPO さんのコメント...

はじめまして、素晴らしい拡張機能を公開してくださり感謝しております。
早速なのですが、私のFirefox3.0.8で、
sqlite_opt.vacuum_before_reindexをtrueに設定して今すぐ実行ボタンを押すと、
エラーコンソールに
エラー: uncaught exception: [Exception... "Component returned failure code: 0x8052000e (NS_ERROR_FILE_IS_LOCKED) [mozIStorageConnection.executeSimpleSQL]" nsresult: "0x8052000e (NS_ERROR_FILE_IS_LOCKED)" location: "JS frame :: chrome://sqlite_opt/content/storage.js :: sql_opt_Reindex :: line 55" data: no]
と出て、何もせず?状態になります。
falseの場合は完了ダイアログボックスが出てくれます。
つたない説明で恐縮ですが、解決方法等ございましたらよろしくお願いします。

シーサー さんのコメント...

おはようございます。
感想ありがとうございます。

エラーメッセージからすると、データベースがFirefoxから使用された状態になっているのでvacuum出来ないのが原因のようです。
[今すぐ実行]でエラーが出て、Firefox終了時に自動的に実行させた場合にはエラーが出ないようであれば Firefox 終了時に最適化させるようにしていただけるのが良いかと思います。

本来 vacuum は Firefox が終了した状態でやるのが一番いいので隠しオプションにしてありましたので....、直接的な解決方法じゃなくてすみません。

TOPPO さんのコメント...

お返事ありがとうございます。
私の環境ですと、
sqlite_opt.vacuum_before_reindexをtrueに設定すると、
sqlite_opt.close_countが
sqlite_opt.auto_reindex_per_browser_closeで設定した値の一つ前で止まります。
10なら9、2なら1で値が増えなくなります。
Firefox終了時もHDDにアクセスしていないようです。

sqlite_opt.vacuum_before_reindex:falseだと
上記のようなことは事はありません。

vacuumは諦めた方がいいですかね。

シーサー さんのコメント...

う~ん、そうですね。
Reindex が元々の目的の拡張機能ですので、reindex のみでおねがいします。

ところで、ご利用の環境は Mac ですか?

TOPPO さんのコメント...

了解です、お手数をおかけしました。
環境は、XPHomeSP3、Fx3.0.8です。

keito さんのコメント...

はじめまして。firefox3では、このアドインのおかげで、めちゃめちゃ起動が高速化され、助かりました。
3.5版も、ぜひぜひよろしくお願いいたします。

シーサー さんのコメント...

keitoさん:
ありがとうございます。
遅くなりましたが、本日 3.5 に対応した版をアップしました。Mozilla Addons に反映されるのはもうちょっと時間がかかりそうですので、後しばらくお待ちください。

シーサー さんのコメント...

TOPPOさん:
3.5対応版でエラー処理を見直しました。今度は途中で止まることはなくなったかと思います。
もしよろしければ動作の結果を教えていただけると助かります。

keito さんのコメント...

ありがとうございます(^^)
3.5対応、ホントありがとうございます。
劇的に早くなりました~。

いまのところ、不具合はないようです。
今後ともよろしくお願いします。

シーサー さんのコメント...

keitoさん:
早速ありがとうございますm(__)m
FF が標準で同じような機能を実装してくれたらお待たせすることも無いんですけどね~

asm さんのコメント...

places.sqliteは
var conn = Components.classes["@mozilla.org/browser/nav-history-service;1"].getService(Components.interfaces.nsPIPlacesDatabase).DBConnection;

でアクセス可能です

cookieは無理ですが
ただ。。。すごく大きいので処理に時間かかるんですよね

シーサー さんのコメント...

asmさん:
おお、ありがとうございます。
参考にさせていただきます。
ゴタゴタが落ち着いたら挑戦します。

asm さんのコメント...

0.2をベースにFx3.5対応およびVACUUM抑制
ここ(http://vimperator.g.hatena.ne.jp/teramako/20090429/1240981936)とか
ここ(http://code.google.com/p/sqlite-manager/issues/detail?id=219#c3)を参考にコピペしてみた
http://dl.getdropbox.com/u/127081/sqlite_opt%40c_sar.jp/content/storage.js

私以外の使用を想定してない欠陥品ですが

シーサー さんのコメント...

asmさん:
遅くなりました。
7/31に提示していただいたコードでうまく行きました。ありがとうございました。
もうしばらくこのまま使ってみて、特に変なところもないようでしたら v0.6 としてアップしたいと思います。

R. さんのコメント...

SQLite Optimizer 0.6試してみました。
3.0.13では(portable版だからか?)places.sqliteのreindexが出来ていないようです。

portable版
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13
新規に落として試しました。

オプションのREINDEX sqlite database on exitとVACUUM before REINDEXは両方共にチェックせずにREINDEX now実行すると、
↓の結果です。
V R
- o content-prefs.sqlite
- o cookies.sqlite
- o downloads.sqlite
- o formhistory.sqlite
- o permissions.sqlite
x x places.sqlite
- o search.sqlite
- o urlclassifier3.sqlite

エラーコンソールに↓
[Exception... "Component returned failure code: 0x80570018 (NS_ERROR_XPC_BAD_IID) [nsIJSCID.getService]" nsresult: "0x80570018 (NS_ERROR_XPC_BAD_IID)" location: "JS frame :: chrome://sqlite_opt/content/storage.js :: sql_opt_Reindex :: line 57" data: no]

また、
オプション画面を表示(Add-onsでOptinsボタンをクリック)するとエラーコンソールに↓の警告が出る。
Warning: Empty string passed to getElementById().
REINDEX nowボタンを押してdoneウィンドが出た時にOKボタンを押しても↑の警告が2回出る。



portable版
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2
では問題ないようですが、
Warning: Empty string passed to getElementById().の警告は同じように出ます。

V R
- o content-prefs.sqlite
- o cookies.sqlite
- o downloads.sqlite
- o formhistory.sqlite
- o permissions.sqlite
- o places.sqlite
- o search.sqlite
- o signons.sqlite
- o urlclassifier3.sqlite

シーサー さんのコメント...

R. さん:
報告ありがとうございました。
修正版をバージョン公開しました。

Warning: Empty string passed to getElementById() の件については、まだ解決できていません。
私がインストールしているほかの拡張機能でも設定ダイアログを表示すると同じようなメッセージが出るのがありますね...。うーむ。

Masaaki さんのコメント...
この投稿は投稿者によって削除されました。
シーサー さんのコメント...

Masaaki さん:
反映されるのにちょっと時間がかかるようです。
しばしお待ちください。

あーる さんのコメント...

古いバージョンを表示をクリックしたところ、
https://addons.mozilla.org/ja/firefox/addons/versions/11198
のページになりねそちらに0.7が登録されていました。

Cai さんのコメント...

0.7 インストールさせていただきました。
この前 sqlite3 で VACUUM したばかりなので、VACUUM は試すことができませんでしたが。

ところで Thunderbird への対応は考えていらっしゃいませんか?
主なターゲットは global-messages-db.sqlite という超重量級ですが。

シーサー さんのコメント...

Caiさん:
はじめまして。ダウンロードいただきありがとうございます。
Thunderbird ですか。私も Thunderbird 使いですが、global-messages-db.sqlite というファイルはプロファイルフォルダに見つかりませんでしたが。
お使いの Thunderbird のバージョン等教えていただけないでしょうか。私は 2.0.0.23 を使用中です。

シーサー さんのコメント...

Caiさん:
global-messages-db というのは TB3 で使用されているデータベースなんですね。いま、β3 をインストールしてみました。基本的には install.rdf の アプリケーションidを変えればいけそうな気がするのでちょっと試してみます。

シーサー さんのコメント...

Caiさん:
なんとか、global-messages-db.sqlite の vacuum/reindex ができるようになりましたが。
Pentium4のPCで約330MBのglobal-messages-dbを処理すると5分近くかかりました。
はたしてこれは実用に耐えうるのか...。
あ、TB3のcookies.sqliteもやはりアクセス不能ですね。

Cai さんのコメント...

すいません、肝心なこと書き忘れてましたね。
Tb3 系列から Fx3 系列と同様、sqlite がメインで採用されるようになります。

> Pentium4のPCで約330MBのglobal-messages-dbを処理すると5分近くかかりました。
> はたしてこれは実用に耐えうるのか...。

やはりそれくらいかかってしまいますか……
自動処理は外して手動のみにしたほうがいいかもしれませんね。

Thunderbird だけでなく Calendar (Lightning, Sunbird) への対応もお願いできませんでしょうか?
これらでは プロファイルフォルダ内の *.sqlite ファイルだけでなく、storage.sdb ファイルおよび calendar-data フォルダ内の *.sqlite ファイルが対象になります。

シーサー さんのコメント...

Caiさん:

>Thunderbird だけでなく Calendar (Lightning, Sunbird) への対応もお願いできませんでしょうか?

普段は Googleカレンダーを使っているもんで・・・、って、拡張機能入れればGoogleカレンダーが使えるんですね。いいですね。
Sunbird早速入れてみました。
Lightning はまだ TB3 には対応してないようですね。

挑戦してみます^^

シーサー さんのコメント...

Caiさん:
Lightning Nightly Updater (Unofficial) 0.9.090618 で無事インストールできました>TB3 対応のLightning

RJ さんのコメント...

こんにちは。以前のバージョンから利用させていただいて、FOXが快適に使えるようになり、とても感謝しています。

今回、0.7をダウンロードして、早速REINDEXを実行してみましたところ、下記のように、VACUUMの結果がすべて「%」になっています。これで正常に動作していますでしょうか? ご教示いただけると幸いです。すばらしいアドオンをありがとうございます。


V R
% o content-prefs.sqlite
% x cookies.sqlite
% o downloads.sqlite
% o formhistory.sqlite
% o permissions.sqlite
% o places.sqlite
% o search.sqlite
% o urlclassifier3.sqlite

シーサー さんのコメント...

RJさん:
ありがとうございます。
説明不足ですみませんでした。
% は問題ないです。
VACUUMのチェックボックスが入っている状態で、フラグメントが20%未満の場合はVACUUMをスキップするようにしていますので、その場合は "%" と表示するようにしてます。

RJ さんのコメント...

シーサー様

了解いたしました。ご返信いただき、ホントにありがとうございます!! これからも末永く愛用させていただきます。

DrB さんのコメント...

はじめまして。下記サイトからSQLite Optimizer をインストールできないようです。「インストールファイルが壊れています」というような表示が出ます。ご確認いただければ幸いです。

https://addons.mozilla.org/ja/firefox/addon/11198

シーサー さんのコメント...

DrBさん:
報告ありがとうございます。
う~ん、こちらで試してみましたがそのようなエラーは表示されませんでした。。。。
右クリックでダウンロードしてからインストールしても壊れてる旨のメッセージは出るんでしょうか。

GrB さんのコメント...

今日は問題なくDWLできました。お騒がせいたしました。ただ、原因が不明なのが気になります。