[pgsql-jp: 29561] Re: インデックスの利用について

shiina shiina @ senpo.com
2003年 4月 2日 (水) 14:02:47 JST


椎名です。

石井さん、ありがとうございます。

> なるほど.effective_cache_size = 10000 の場合,SET STATISTICS'の値が40
> で始めてインデックスが使われるようになったのですね.興味深い報告でした.

はい。そのとうりです。

テーブルの項目数は(キー項目以外は)かなり省略してありました。申し
訳ありません。

> (1) contrib/pgstattupleを使う.正確かつ簡単にサイズを知ることができる
>     が,実行のたびにテーブルを全スキャンするので,実運用中などで負荷が
>     気になる場合はおすすめしません.

まだテストサーバですのでいろいろできます。
こういったツールを使ったことがなくちょっと迷ってしまいました。
石井さんが作られたのですね。ドキュメントが日本語で助かりました。

結果です。
table_len          | 299851776
tuple_count	       | 1046698
tuple_len          | 290065120
tuple_percent      | 96.74
dead_tuple_count   | 0
dead_tuple_len     | 0
dead_tuple_percent | 0
free_space         | 4723360
free_percent       | 1.58

> (3) 最近VACUUMを実行した時点のサイズでよければ,以下の問い合わせでサイ
>     ズを知ることができる.
> 
>     SELECT relpages FROM pg_class WHERE relname = 'table1';

 relpages
----------
    36603

> pg_statisticの占める容量はたいしたものではないし,SET STATISTICSの値が
> 20から40に増えたところでANALYZEの負荷がさほど増えるとは思えないので,
> この例で言えばトレードオフと言うほどではないと思います.
> まあ,DB内の全テーブルのぜんぶのSET STATISTICSの値を増やせば影響がある
> と思いますが.

わかりました。

本格的にデータベースを扱うのが初めてで、見当違いをしているかもし
れません。ご指摘ください。

オプティマイザの動作にはルールベースとコストベースがあり
PostgreSQLはコストベース。
今回のケースではプランナ用の統計情報の精度がデフォルトのままでは
ダメで、さらにディスクキャッシュが小さすぎたので統計情報の精度を
上げてもダメだった。ということは、キャッシュが違うデータで埋まっ
ていた場合、やはりインデックスは使われないということはないでしょ
うか?
小さなテーブルだと違うと思いますが、今回のようなサイズのテーブル
だと、全件走査するよりも使える場合はインデックスを使った方が確実
に早いように思いますので、たとえば特定のテーブルは必ずインデック
スを使うような設定ができればいいなと考えています。





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