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

sugita @ sra.co.jp sugita @ sra.co.jp
2003年 5月 24日 (土) 01:55:13 JST


  杉田です。

From: "Iso, Toshitaka" <toshitaka.iso @ hp.com>
Subject: [pgsql-jp: 30036] 「vacuum 」と「analyze」と「vacuum analyze」と「vacuum full」の違いについて
Date: Fri, 23 May 2003 16:03:17 +0900

;;; 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でした。

  count(*) と reltuples の大幅な食い違いは、例えば、削除されたレコードが多く、
偏りがある場合に、ANALYZE をしたときに発生します。ANALYZE は、サンプリングし外
挿するからです。

  FSM が正しく調整された元で、VACUUM を適切に実行してあれば、ANALYZE 後の
reltuples の値は、誤差程度とみなせるようになると思われます。

;;; ## vacuum analyze後の結果
;;; 実際のレコード件数=129件

  VACUUM ANALYZE 後の count() による実際の件数でしょうか? そうすると最初の方で
は、データ件数が 9 万程と言われているのと合いません。

;;; reltupleの値=89762(単位は「件」?)

  型が real なので、その精度での件数です。

;;; ところが、analyzeだけを実行したところ、
;;; pg_classの当該テーブルのreltuple値がDeleteしたテーブルの
;;; レコード件数と一致し、Index Scanをしてくれるようになりました。
;;; 
;;; ## analyze後の結果
;;; 実際のレコード件数=129件
;;; reltupleの値=129(単位は「件」?)

  delete した件数に一致したというのは疑問に思いますが、極端に違うと考える事に
します。

  RedHat の pg_filedump で、テーブルのファイルをダンプして、どのような分布になっ
ているか調べ、外挿されて上記のように成り得るかを確認するのはどうでしょう?

  pg_filedump は、RedHat の web page の search で探せます。

;;; 長々書きましたがここで質問です。
;;; 
;;; 「vacuum」と「analyze」と「vacuum analyze」と「vacuum full」の違いについて
;;; 確認させてください。
;;; 
;;; 私の認識とマニュアルで確認結果です。
;;; 
;;; 【vacuum】
;;; 削除済みレコードを空き領域にする。統計情報は更新しない。

  reltuples が正確な値となります。

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

  reltuples には外挿値が入ります。

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

  統計情報が更新されていないと判断されたのはどのよう事からですか?

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

  はい。不要なインデックスタプルも減ります。
  

Kenji Sugita                                      





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