[pgsql-jp: 30008] Re: SET STATISTICS の統計情報の目標値決定指標

Tatsuo Ishii t-ishii @ sra.co.jp
2003年 5月 20日 (火) 23:36:02 JST


石井です.

> 割合が少なくても持ってくる件数が多いと、Index Scanではなく
> Seq Scanになってしまうのでしょうか。

それは当然そうでしょう.インデックススキャンでは,

(1) インデックスから該当エントリを検索.MVCCの関係で複数タプルが見つか
    ることがあるので,それぞれのタプルについて以下を処理する.

(2) テーブルのTIDを知る

(3) そのTIDを使ってテーブルの該当レコードをアクセスする

(4) そのレコードが,このトランザクションから見てデッドタプルでないこと
    を検査

(5) OKなら検索完了,そうでなければ(2)に戻る

というように余計なディスクアクセスが入るので,検索件数が多ければ多いほ
ど順スキャンよりも高コストになる傾向があります.

> このIndex Scanをしてくれる可能性を高める方法は、enable_Seq_scan
> のパラメータのみでしか制御は不可能でしょうか?

もしも強制的にインデックスを使わせてみて,そちらの方が順スキャンよりも
実際には高速である場合には,カーネルのバッファキャッシュなどの影響で,
ディスクアクセスが多いにも関わらず高速に処理できている可能性も考えられ
ます.その場合はとりあえず,effective_cache_size を10-100倍くらいに増
やしてみてはどうでしょう.

また,

SELECT * FROM .... LIMIT 100000;

のように,ダミーのLIMIT句を付けると効果がある場合もあるようです.

ところで,素朴な疑問ですが,検索結果が20万件もあると,フロントエンドに
転送するだけでも結構な時間がかかってしまいますし,受け取る方も膨大なメ
モリを消費します.そういうDBアプリケーションの設計は果たして妥当なので
しょうか?
--
Tatsuo Ishii



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