[pgsql-jp: 41305] autovacuum時のreltuples推定の内部挙動について

mochizuki duvote @ gmail.com
2012年 12月 13日 (木) 06:36:08 JST


こんにちは。望月と申します。

autovacuum時のreltuples推定の内部挙動でよく分からない点が
ありましたので、申し訳ありませんが質問させて下さい。

------------------------------------------------------------------------
○背景

現在以下の環境でPostgreSQLを動かしています。

バージョン:PostgreSQL 9.1.6
OS:Red Hat Enterprise Linux Server release 5.6 (x86_64)

最近autovacuum実施後のタイミングに、不適切な実行計画が選択され、
性能が大きく劣化する問題が発生することに気が付きました。

そこでautovacuumのタイミングで統計情報を確認すると、
一時的にpg_class.reltuplesの値が非常に大きな値になる事を確認しました。
(データ量が少ないテーブルだと実レコード数の〜数10倍の誤差)

------------------------------------------------------------------------
○質問

ソースコードで該当しそうな箇所を探すと、
以下のようにしてreltuplesを推定しているように見えました。

スキャンしたページのうち、
(「現在有効なタプル数」+「無効だがまだ削除できないタプル数」) / (「スキャンしたページ数」)(★)

の比率と以前の情報から、「全ページで有効なタプル数」を推定

※該当箇所
vacuumlazy.c の lazy_scan_heap() 〜 vacuum.c の vac_estimate_reltuples()

http://doxygen.postgresql.org/vacuumlazy_8c_source.html#l00361
http://doxygen.postgresql.org/vacuum_8c_source.html#l00482

ここで質問ですが、(★)にて「無効だがまだ削除できないタプル数」を
推定に使用しているのは何故なのでしょうか?

素直に考えれば、「現在有効なタプル数」のみで
推定した方が高精度な推定が出来そうな気がしています。

------------------------------------------------------------------------

素朴な疑問をだらだと書いてしまい恐縮ですが、
御見識のある方がいらっしゃいまいたら、御教示頂けますと幸いです。

--
望月


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