[pgsql-jp: 41591] Re: order by での indexの利用について

TAKATSUKA Haruka harukat @ postgresql.jp
2014年 3月 13日 (木) 13:41:55 JST


prodさん
高塚と申します。

・現状、どんな実行プランでしょうか?
   order by b.col1 を加えた場合、外した場合の explain 結果をお知らせください

explain analyze select
  a.col1 ,a.col2 ,a.col3 ,b.col1 ,b.col2
  from table_a a inner join table_b b on (a.col1=b.col1)
  order by a.col1,a.col2,b.col1 offset 0 limit 500

・大した行数ではないのでインデックスが無くとも 数秒で済みそうですが、
 大きいデータを含むカラムがあるのでしょうか?
 テーブルの物理サイズはどのくらいでしょうか?
 また、どのくらいの応答時間を目指しているのでしょう?
 select pg_relation_size('table_a'); -- バイト単位の物理サイズ確認例

・下記は複合インデックスですか? それとも2つ各々のインデックスですか?
> table_a には  a.col1,a.col2 で indexを作成しており、

といったあたりを提示いただければ、コメントできるかもしれません。


On Thu, 13 Mar 2014 11:32:02 +0900 (JST)
prod2011 @ yahoo.co.jp wrote:

> こんにちは、prodと申します。
> 
> テーブルを連結してOrder byした後で、limit かけて500件表示
> 
> といった処理をしていますがデータの取得が遅く、
> 困っています。
> 
> 環境は以下です
> 
> サーバOS:Red Hat Enterprise Linux Server release 5.3
> Postgresバージョン:PostgreSQL 9.1.2
> 
> 具体的には以下のようなSQLです
> 
> select
> a.col1
> ,a.col2
> ,a.col3
> ,b.col1
> ,b.col2
> from table_a a
> inner join table_b b (a.col1=b.col1)
> order by a.col1,a.col2,b.col1
> offset 0 limit 500
> 
> 
> table_a には  a.col1,a.col2 で indexを作成しており、
> table_b には  b.col1 で indexを作成しております。
> (index は btreeです)
> 
> このまま実行すると、データの取得に時間がかかり、
> 困っています。
> 
> 
> order byからb.col1を除くと、Order byで、
> a.col1,a.col2のindexを使ってくれるようになり、非常に高速となるのですが、
> b.col1を order by に追加すると、indexを使ってくれません。
> 
> 
> order by a.col1,a.col2,b.col1
> としても、 a.col1,a.col2 のindexは使ってくれる。
> といったようにはならないものなのでしょうか?
> また、他の方法でもいいですが、高速かすために良い方法は
> 
> ございますでしょうか?
> 
> 件数:table_a 20万件
>       table_b 100万件
> 程度です。
> 
> アドバイスいただけますと、幸いです。 



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