[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 メーリングリストの案内