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

Ishii, Satoshi (PSNC) ishiis @ jp.sony.com
2008年 2月 1日 (金) 20:52:23 JST


石井です。

前提の説明が足りなかったかもしれませんが、インデックスも含めたテーブル設計
のために、いろいろとパフォーマンスについて調べていたところでした。

> 私の提案した
> インデクスの定義は(A1,A2)とし、
> 「select * from A where A1=1 order by A1,A2」
> とSQLの記述を変更することで、性能はどの程度改善しましたか?

limit 200を入れて、1秒以内に改善されています。別の400万件程度のデータでも確認しましたが、
ほぼ、同様の結果でした。

よろしくお願いいたします。

> -----Original Message-----
> From: pgsql-jp-bounces @ ml.postgresql.jp 
> [mailto:pgsql-jp-bounces @ ml.postgresql.jp] On Behalf Of chuuken kenkou
> Sent: Friday, February 01, 2008 8:41 PM
> To: PostgreSQL Japanese Mailing List
> Subject: [pgsql-jp: 39134] RE: RE: Re: Indexを使ったパフォーマンス向上
> 
> 
> 忠犬KEN公です。
> 
> 一部訂正。
> 
> 根本的にテーブル設計を、見直すべきことは変わりありません。
> 
> > 「where A1=1」で「order by A1,A2 limit 200」のためには、「重複している
> > 40万〜50万件を検索しないと、昇順に200件」を決められません。
> 
> 上記は、当初から質問にあった
> インデクスの定義は、
> (1)A1だけのインデクス
> (2)A2だけのインデクス
> (3)(A1,A2)のインデクス
> で、
> 「select * from A where A1=1 order by A2」
> と記述した場合でした。
> 
> 私の提案した
> インデクスの定義は(A1,A2)とし、
> 「select * from A where A1=1 order by A1,A2」
> とSQLの記述を変更することで、性能はどの程度改善しましたか?
> 
> 今のテーブル設計では、これ以上の性能を出すことは殆ど無理だと
> 思います。
> 
> 
> 
> 
> 
> > Date: Fri, 1 Feb 2008 20:26:06 +0900
> > Subject: [pgsql-jp: 39133] RE: Re: Indexを使ったパフォーマンス向上
> >
> >
> > 忠犬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=pbWl16X
> > qpeGl86XI
> 
> _________________________________________________________________
> 確定申告大丈夫?Live Searchで検索していろいろ下準備。
> http://search.live.com/results.aspx?mkt=ja-jp&q=%E7%A2%BA%E5%A
> E%9A%E7%94%B3%E5%91%8A&FORM=MGCEAB
> 
> 



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