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

花田 茂 hanada @ metrosystems.co.jp
2014年 3月 13日 (木) 14:48:59 JST


花田です。

(2014/03/13 11:32), 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は使ってくれる。
> といったようにはならないものなのでしょうか?
> また、他の方法でもいいですが、高速かすために良い方法は

INNER JOINの結合条件で a.col1 = b.col1としているので、b.col1はなくても同
じ結果になりそうな気もしますが…

> 
> ございますでしょうか?
> 
> 件数:table_a 20万件
>        table_b 100万件
> 程度です。
> 
> アドバイスいただけますと、幸いです。
> 
> 

こういったチューニングでは、まずEXPLAIN結果(できればANALYZEオプションつ
き)を見るのが王道です。テーブル名などは区別がつけばマスキングしてあって
もよいので、ORDER BY に b.col1を指定した場合としていない場合の EXPLAIN
ANALYZE 結果を提示できないでしょうか?

また、もし未実施であれば、ANALYZEコマンドで統計情報を更新してみてください。


-- 
株式会社メトロシステムズ
  花田 茂
Mail : hanada @ metrosystems.co.jp
 Tel : 03-5951-1219
 Fax : 03-5951-2929


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