PostgreSQL 8.2系で、大多数のラージオブジェクトを廃棄しました。容器も小さくするにはVACUUM FULLを掛ける必要が有りました。
主にサムネイルの保存に使っています。20万個有ったものを削除し、1000個程が残っただけでした。
しかし、テーブルの容器が5.5GB程まで膨れ上がっていて、通常のVACUUMでは小さくなりません。これも小さくしたいと思いました。
インデックスが入っているのでloidを指定する検索は速いようです。しかし、SELECT COUNTによる数え上げには時間が掛かります。400秒程。通常のVACUUM掛けても検索時間はまったく変わりません。
次のようにSQL文を発行した所、容器が小さくなりました!
REINDEX TABLE pg_largeobject;
VACUUM FULL pg_largeobject;
クエリーは、2272953 ミリ秒で結果なしでうまく帰りました。 ※約38分
掃除前:
2011/12/08 09:57 1,073,741,824 2613
2011/12/07 17:45 1,073,741,824 2613.1
2011/12/08 10:02 1,073,741,824 2613.2
2011/12/08 10:02 1,073,741,824 2613.3
2011/12/08 09:57 1,073,741,824 2613.4
2011/12/08 09:49 225,402,880 2613.5
6 個のファイル 5,594,112,000 バイト
掃除後:
2011/12/08 10:17 638,976 2613
2011/12/08 10:17 0 2613.1
2011/12/08 10:17 0 2613.2
2011/12/08 10:17 0 2613.3
2011/12/08 10:17 0 2613.4
2011/12/08 10:17 0 2613.5
6 個のファイル 638,976 バイト
容器が小さくなり、大幅に使用量が削減されました。
2011年12月8日木曜日
2011年9月6日火曜日
loを作成し、書き込む方法
PostgreSQLで、ラージオブジェクトを作成し、書き込む方法。
SELECT lo_creat(0);
結果: 17242
SELECT lo_open(17242, 393216);
結果: 0
SELECT lowrite(0, E'\x31\x32\x33'::bytea);
結果: 3
SELECT lo_close(0);
結果: 0
注意点:同じトランザクション内で実行いたします。そうでなければ、lo_openで開いたハンドルがlowriteに渡る頃には閉じていて、使えないようになります。こちらに注意書きが有りました。
SELECT lo_creat(0);
結果: 17242
SELECT lo_open(17242, 393216);
結果: 0
SELECT lowrite(0, E'\x31\x32\x33'::bytea);
結果: 3
SELECT lo_close(0);
結果: 0
注意点:同じトランザクション内で実行いたします。そうでなければ、lo_openで開いたハンドルがlowriteに渡る頃には閉じていて、使えないようになります。こちらに注意書きが有りました。
登録:
投稿 (Atom)