[pgsql-jp: 36251] Re: インデックステーブルが使われない理由?
ISHIDA Akio
iakio @ mono-space.net
2005年 10月 22日 (土) 03:25:20 JST
こんにちは。石田@苫小牧市です。
Sato_Kenichi wrote:
>>index tableのハッシュ値も同じのがいっぱい有るんでしょう
>>ね。
>>だからといって、index tableを使わないのは納得できません。
>>index tableが使われない理由をご存じの方、教えて下さい。
>
indexがあるからといって、必ずしもindex scanが速いとは
限りません。理由はおそらく、
o 少なくても行を取り出すためにインデックスとテーブル
本体の両方にアクセスする必要がある。
o seq scanでは単にテーブルの先頭から順に行を取り出せば
良い為、1回のページアクセスで大量の行を取り出せるが、
index scanの場合はテーブル内にちらばった行に対して
アクセスしなければならない為、1回のページアクセスで
取り出せる行数がとても少ない(可能性がある)。
といったところだと思います。
そのため、大量の行がヒットしそうな場合は、プランナは
seq scanを選択します。
このコストの見積りには、「データがどれだけバラついて
いるか」の他に、テーブル内での物理的な格納順がどれだけ
バラついているか、というのも計算の要因になっているようです。
こういったコストの予測するためには
データをサンプリングする必要があります。これがanalyzeです。
木村さんのケースでは、もしかしたら「東京都」ではseq scan
を選択するが「沖縄県」ならindex scanを選択する、という
可能性もあります。
さとうさんのご指摘のように、enable_seqscan = false
にして、実際にindex scanの方が速くなるかどうか確かめて
みるのも良いと思います。これでindex scanの方が速いようで
あれば、プランナの見積りがずれているということなので、
プランナに関するいくつかのパラメータをチューニング
するという選択肢もあります。
以下は、以前にユーザ会北海道支部で行なった勉強会の資料です。
ラフなまとめですが、ご参考になれば。
http://www.mono-space.net/doc/jpug_ezo0501/
>
> 私も同じような経験があります。
>
> 100万件くらい入っているテーブルを検索したら、やたら時間がかかるので、
> EXPLAIN してみたら Seq Scan になってました。
> (INDEXを作ったカラムで検索してるのに…)
>
> 私の場合、postgresql.conf を編集して、
>
>>enable_seqscan = false
>
> にしたら、見違えるように速くなりました。
>
> これだと Seq Scan のほうが速くなる場合でも、インデックスを使うようになる
> と思いますが、そういう場合はレコード件数が少ないなど無視できる程度だろう
> と思ってます。
>
> 一度この設定で試してみてはいかがでしょう?
>
> index tableが使われない理由は分かりません。
> できれば私も理由が知りたいです。(^^;
>
> ※ サンプル数が少なすぎるのかな…?
>
> ---
> 佐藤 研一
> E-Mail: satok-point @ mf.point.ne.jp
>
>
>
pgsql-jp メーリングリストの案内