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

kasaharatt @ nttdata.co.jp kasaharatt @ nttdata.co.jp
2012年 12月 13日 (木) 19:31:44 JST


笠原と申します。

> ここで質問ですが、(★)にて「無効だがまだ削除できないタプル数」を
> 推定に使用しているのは何故なのでしょうか?
私的にも「無効だがまだ削除できないタプル数」を除いたタプル数での
推定を行うように改善できそうな気がしました。

ただ、強いて理由がありそうだとすると、
・実質的には「無効だがまだ削除できないタプル数」を含んだタプル数を
 スキャンしなければならないSQL(全件検索とか)もある。
もしくは
・「無効だがまだ削除できないタプル数」が相当数蓄積されてしまうケースを
  例外的なものとし、考慮していない。
といったところでしょうか・・

そのため、掃除できなかったタプルも含めて、総数をそのまま reltuples にセット
しているのかなと思います。

どちらかと言えば、
> 一時的にpg_class.reltuplesの値が非常に大きな値になる事を確認しました。
> (データ量が少ないテーブルだと実レコード数の〜数10倍の誤差)
という状況になってしまうことを防ぐか、定期的に明示的なANALYZEを
かけるようにすべきかもしれません。
# ANALYZE はVACUUM と異なり、ANALYZEから見える有効行のみカウントする
  ため、VACUUM で膨れ上がったreltuples を最新の状態に近づけることができます。

本件の場合、例えばロングトランザクションがいたりするため発生している
気がしますので、そこの対処が重要かなと思います。
# テーブルサイズもあるべきサイズより膨らんでいませんか?その場合
  テーブル肥大化により、実行計画はもとよりI/O的にも無駄が発生しますので。

> -----Original Message-----
> From: pgsql-jp-bounces @ ml.postgresql.jp [mailto:pgsql-jp-bounces @ ml.postgresql.jp] On Behalf Of mochizuki
> Sent: Thursday, December 13, 2012 6:36 AM
> To: pgsql-jp @ ml.postgresql.jp
> Subject: [pgsql-jp: 41305] autovacuum時のreltuples推定の内部挙動について
> 
> こんにちは。望月と申します。
> 
> 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 メーリングリストの案内