[pgsql-jp: 38150] Re: COPYによるデータ取り込みでの警告(?)メッセージ

Hiroki Kataoka kataoka @ interwiz.jp
2007年 3月 14日 (水) 18:05:50 JST


片岡です。

Hisashi Chiba wrote:
> 実のところ、ほとんどvacuumは実行しておらず、せいぜい年に1回処理する程度
> でした。
> 
> 他にもテーブルが複数あり、同じ処理をしていますので、不要領域が膨大になっ
> たためと理解しました。
> なのでvacuumを実行すれば、当面このメッセージは表示されないと考えています。

 一度増えてしまった空き領域(VACUUMによって不要領域が空き領域に変換され
ます)は、データが増えて空き領域を消費するか、VACUUM FULLで空き領域を
ファイルシステムに返還するかしない限り、減ることはありません。で、この空
き領域を管理する領域がfsm(フリースペースマップ)ですから、空き領域を減
らすかfsmを増やす(max_fsm_pagesを増やす)かしない限り、メッセージは出続
けることになります。
 また、そのまま運用を続ければ、すべての空き領域を管理できていないわけで
すから、データベースサイズは徐々に肥大していくことになります。

 毎晩VACUUMをしているサイトでは、1日で溜まる不要領域=空き領域は高が知
れていますのでfsmも小さくて済みますが、1年に1度のVACUUMだと1年分の不要領
域=空き領域を管理しなければなりませんから、非常に大きなfsmが必要になっ
てしまいます。またそれだけ不要領域が多いと、DBのパフォーマンスもかなり低
下しているはずです。

 こまめにVACUUMすることが大事です。

> データコピーと同じタイミングでvacuumを実行する事が大切ですね。

 他にデータを更新することがないのであればその通りですが、常に多少なりと
もデータの更新があるのであれば、もっと頻繁にVACUUMする必要があります。
PostgreSQL 8.2.3のマニュアルですが、「22.1.1. ディスク容量の復旧」という
項目に下記のように書かれています。

http://www.postgresql.jp/document/pg823doc/html/routine-vacuuming.html

「ほとんどのサイトで推奨できる方法は、データベース全体のVACUUMを 1日1回
使用頻度が低い時間帯にスケジュールすることです。必要ならば、更新頻度の激
しいテーブルのバキューム処理をより頻繁に行うよう追加してください(非常に
高い頻度でデータの更新を行うインストレーションの中では、分間隔位という頻
度で高負荷なテーブルのVACUUMを行うこともあります)。 1つのクラスタで複数
のデータベースがある場合、それぞれをバキュームすることを忘れないでくださ
い。 vacuumdbプログラムが役に立つかもしれません。」

-- 
Hiroki Kataoka <kataoka @ interwiz.jp>



pgsql-jp メーリングリストの案内