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

chuuken kenkou ken_ken_1962 @ hotmail.com
2008年 2月 1日 (金) 20:26:06 JST


忠犬KEN公です。

整理すると、次のような内容でしょうか?

(1)PostgreSQL 7.4.2を使用。
(2)テーブルAの構成列は、(A1,A2)
(3)A1の値の種類は、10種類くらいしかない。
(4)A1の重複件数は、例えば「1」の値なら、40万〜50万件
(5)今後もデータが増える。
(6)検索は、「select * from A where A1=1 order by A1,A2 limit 200」と
いったパターン。


自分で何をやろうとしているか、理解されているでしょうか?

「where A1=1」で「order by A1,A2 limit 200」のためには、「重複している
40万〜50万件を検索しないと、昇順に200件」を決められません。

「SQLの記述」や「インデクスの付け方」といった工夫で、どうこうできる
といった次元の話ではありません。

神内さんからもコメントがありましたが、根本的にテーブル設計を見直す
べき問題です。



> Date: Fri, 1 Feb 2008 12:34:10 +0900
> From: ishiis @ jp.sony.com
> To: pgsql-jp @ ml.postgresql.jp
> Subject: [pgsql-jp: 39131] Re: Indexを使ったパフォーマンス向上
>
> 石井です。
>
> メールの文と順序が異なりますが、お許し下さい。
>
>>>>以下も試していたのですが、やはりindexはA1が利用されており、複合indexが利用されません。whereを抜くと使っ
>> てくれるのですが...
>>>
>>>>> 未検証ですが、A1列とA2列に複合インデクスを定義し、
>>>>> select * from A where A1=1 order by A1,A2 limit 200
>>>>> とした場合、どうでしょうか?
>>>
>>> インデクスの定義を(A1,A2)の順とし、「order by
>> A1,A2」と、インデクスを構成する先頭列から順番にorder by指定されているでしょうか?
>>> もしこれが勘違いであれば、すべて納得できます。
>
> これは複合indexの指定順を間違ってしまったようです。複合indexをA2,A1で作成してしまったようです。
> 申し訳ありません。
> 再度、A1,A2で複合indexを作成し、
> select * from A where A1=1 order by A1,A2 limit 200
> を試したところ、複合indexが利用され、パフォーマンスの改善も確認できました。
> ありがとうございます。
>
>>> A1列の値ですが、「すべて0」または「殆どが0」になっていないでしょうか?
>>
>> は、「すべて1」または「殆どが1」の誤りでした。訂正します。
>
> そのとおりです。このこのテスト環境のデータはA1は全て1で、実環境でもデータとしては
> A1は最大でも10種類程度しかない想定です。
>
> よろしくお願いいたします。

_________________________________________________________________
栄養不足?MSN相談箱で「サプリメント」について知ろう!
http://questionbox.msn.co.jp/search.php3?start=0&pt=0&qt=all&k=pbWl16XqpeGl86XI



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