[pgsql-jp: 30036] 「vacuum」と「analyze」と「vacuum analyze」と「vacuum full」の違いについて

Iso, Toshitaka toshitaka.iso @ hp.com
2003年 5月 23日 (金) 16:03:17 JST


お世話になります。

VacuumとAnalyze、Vacuum Analyzeの違いについてお教え下さい。

【PostgreSQLのバージョン=7.2.1】



あるテーブル(データ件数=9万件ほど)があります。
このテーブル構造は以下のような感じで、lockkbnとlocknoで
Primary Keyとなっております。
 lockkbn      | character(4)                 | not null
 lockno       | character varying(40)      | not null
 lockcndtn   | character(1)                  |
 lockstrtdt   | timestamp with time zone |
 lockenddt   | timestamp with time zone |

しばらくの間はlockkbnとlockcndtnで検索を行うと、
Primary keyを使用してIndex Scanが走っていたのですが、
データ件数が増えるにつれSeq Scanが走るようになりました。

ここで、不要レコードを削除し、vacuum analyzeをかけるという
ことになったのですが、
select * from pg_class where relname='tbl_hoge'
のreltupleの値がcount(*)で検索した際のレコード件数と
違い膨大な数をもっており相変わらずSeq Scanでした。

## vacuum analyze後の結果
実際のレコード件数=129件
reltupleの値=89762(単位は「件」?)

ところが、analyzeだけを実行したところ、
pg_classの当該テーブルのreltuple値がDeleteしたテーブルの
レコード件数と一致し、Index Scanをしてくれるようになりました。

## analyze後の結果
実際のレコード件数=129件
reltupleの値=129(単位は「件」?)


長々書きましたがここで質問です。

「vacuum」と「analyze」と「vacuum analyze」と「vacuum full」の違いについて
確認させてください。

私の認識とマニュアルで確認結果です。

【vacuum】
削除済みレコードを空き領域にする。統計情報は更新しない。

【analyze】
統計情報の更新。削除済みレコードの空き領域処理はしない。

【Vacuum Analyze】
VacuumとAnalyzeを実行?
(実際は統計情報は更新されていませんでした)

【Vacuum full】
空きデータ領域をデフラグ?



上記認識に間違いがあればご指摘いただけないでしょうか?
現状はVacuum analyzeを1日一回、analyzeのみを1日一回
実行しています。

以上です。



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