[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 メーリングリストの案内