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