[pgsql-jp: 39115] RE: Indexを使ったパフォーマンス向上

chuuken kenkou ken_ken_1962 @ hotmail.com
2008年 1月 30日 (水) 18:41:57 JST


忠犬KEN公です。

A1列、A2列は、それぞれ値の種類は何種類くらいあるのでしょうか?
つまり、

select count(distinct A1),count(distinct A2) from A

の結果が知りたいということです。

A1列の単一列インデクスを削除し、A1とA2列の複数列インデクスがある状態で確認することは可能でしょうか?


> これに対し、以下のようなSQLを投げ、EXPLAIN ANALIZEを入れると、利用されている
> IndexはA1と表示されます。レコード件数が多いせいもあると思いますが、30秒近くかかります。
>
> select * from A where A1=1 order by A2 limit 200

当方はPostgreSQL 8.0.0ですが、2万件程度で擬似的な環境を作ってテストしてみたところ、

select * from A where A1=1 order by A2 limit 200

では、複数列インデクスは使われませんでした。

select * from A where A1=1 order by A1,A2 limit 200

では、複数列インデクスが使えました。


> 一方、上記でwhere A1=1を外すと、一瞬で結果が表示されます。この場合、A2が利用されている

これは、「where A1=1」の条件がある場合と、等価ではないですよね?
無条件にA2のインデクスの先頭から200件なので、早くて当然だと思います。

> ようです。また、Where A1=1を残し、order by A2 limit 200を外すと、5-6秒程度の検索時間になります。

これも「where A1=1」の条件で絞り込んだ後のソートが不要になるので、検索条件とソートの両方がある場合に比べて、複数列インデクスが使えていないケースよりは早くなることは想像できます。

_________________________________________________________________
「ペットの悩み、みんなにきいたら解決した。」安心のペットライフにMSN相談箱
http://questionbox.msn.co.jp/c531.html



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