[pgsql-jp: 40288] Re: Vacuumによる物理的なDiskの開放について質問

Tomoaki Sato sato @ sraoss.co.jp
2010年 6月 4日 (金) 10:10:11 JST


佐藤です。

From: Takahiro Itagaki <itagaki.takahiro @ oss.ntt.co.jp>
Date: Thu, 03 Jun 2010 13:52:16 +0900

> "Jun'ya Nishida" <nishida @ nextgen.co.jp> wrote:
> 
>> DBからの大量のレコード(70万レコード)削除、その後、翌朝の
>> vacuum(vacuum fullは実施してません)では、Diskの使用量は
>> とくに減りませんでしたが、3日後のvacuum終了時点で、Disk使用量
>> が大幅に減少しました。
>> 
>>   なぜ二日もたってから、急にDiskが開放されたのか?というのが
>>   そもそもの疑問です。
> 
> VACUUM (無印) は、ファイルの末尾に有効な行が無い場合にのみ
> ファイルを縮小します。
> 
> [行] [空] [行] [空] [空] [空] [行]
> 
> のような物理配置状況では VACUUM してもファイルサイズは減りませんが、
> たまたま最後の [行] が DELETE (or UPDATE で別の場所に再配置) されると、
> 
> [行] [空] [行] [空] [空] [空] [ゴミ]
> 
> が VACUUM されて、以下のように縮小されます。
> 
> [行] [空] [行]    (これ以降は全て [空] なので切り詰め)
> 
>> 参考文献、マニュアル等へのポインタでも結構ですので、教えていただけると
>> 助かります。
> 
> マニュアルに記述ってありましたっけ? 該当コードの場所は示せるのですが……。
> http://doxygen.postgresql.org/vacuumlazy_8c.html#19584962e8dba509013cc41ea0482a54

マニュアルの「23.1.2. ディスク容量の復旧」に少しだけ書いてありますね。

  http://www.postgresql.jp/document/8.4/html/routine-vacuuming.html#VACUUM-FOR-SPACE-RECOVERY

かなり分かりづらいですが、2 段落目の「テーブルの最後の 1 つ以上複数ペー
ジが完全にすいていて、また排他テーブルロックが容易に獲得できる特殊な場
合を除き」というのが、FULL でない VACUUM でファイルサイズを切り詰めら
れる条件ですね。

  VACUUMの 標準形式はテーブルとインデックス内の終わっている行バージョ
  ンを削除し、将来の再利用を可能にするための場所に印を付けます。しかし、
  テーブルの最後の 1 つ以上複数ページが完全にすいていて、また排他テー
  ブルロックが容易に獲得できる特殊な場合を除き、その場所をオペレーティ
  ングシステムに返還しません。

あと、日本語訳では「A また B の場合」になっていますが、「A かつ B の場
合」が正しいと思われます。


----
PostgreSQL トレーニング: http://www.sraoss.co.jp/prod_serv/training/
PowerGres ファミリー: http://powergres.sraoss.co.jp/
Tomoaki Sato <sato @ sraoss.co.jp>
SRA OSS, Inc. Japan


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