[pgsql-jp: 41597] Re: order by での indexの利用について
prod2011 @ yahoo.co.jp
prod2011 @ yahoo.co.jp
2014年 3月 14日 (金) 17:27:00 JST
Prodです。
花田様アドバイスありがとうございます。
仕様としては、遅い実行計画のb.col6 をOrder byに入れないといけません。
今回の質問としましては、order by でb.col6をいれた遅い方で早くなる方法が
ないか?というい質問です。(わかりずらくてすいません)
速い方を提示したのは、order by で b.col6を外すと、indexを使った検索となり、
速くなるのに、order byで b.col6を入れると indexを使ってくれず
なぜindexを使わなくなってしまうのかがわからなかったため、その違いとして
提示させていただきました。
> 早い実行計画(ORDER
> BY b.c6なし)ではa.c4, a.c5でのソートをインデックスで保証しており、結合結
> 果の最初の500件を取得した時点で両テーブルのスキャンを途中で止められてい
> ることが大きなポイントだと思います。
ここがよくわかっていませんでした。
order by で b.col6をつけても、 a.col4,a.col5の順番はかわらないので、
table_a_index2 を使ってくれてもいいのではないか?と思ったのです。
やはり、order by は、indexで順番を完全に保証できないとだめなのですね。
データを ヘッダ ボディと2テーブルにする場合に、注意しないといけないですね。
テーブル設計を含めて、見直しすることにいたします。
アドバイスありがとうございました。
とても、参考になりました。
----- Original Message -----
> From: 花田 茂 <hanada @ metrosystems.co.jp>
> To: prod2011 @ yahoo.co.jp; PostgreSQL Japanese Mailing List <pgsql-jp @ ml.postgresql.jp>
> Cc:
> Date: 2014/3/14, Fri 16:50
> Subject: Re: [pgsql-jp: 41593] Re: order by での indexの利用について
>
> 花田です。
>
> (2014/03/14 15:00), prod2011 @ yahoo.co.jp wrote:
>> ここで、order by のb.col6があるとき、ないとき、で全然速度がことなります。
>> 目標としている速度は、2以内秒 です。
>
> そもそも、仕様上 b.c6でソートした結果が必要なのであれば、遅いほうのクエ
> リが本来の性能ではないでしょうか(ORDER BYからb.c6を外した結果は本来取得
> すべきものとは異なっているのだと思います)。b.c6とb.c1の相関によっては
> ORDER BYで省略してもよいかもしれませんが、これは許容されるチューニングな
> のでしょうか?(なんとなく違う気がしています)
>
> それは置いておいて…
>
> 今回のケースの性能差ですが、遅い実行計画(ORDER BY b.c6あり)ではLimit前に
> aとbの結合結果全件をソートする必要があるのに対して、早い実行計画(ORDER
> BY b.c6なし)ではa.c4, a.c5でのソートをインデックスで保証しており、結合結
> 果の最初の500件を取得した時点で両テーブルのスキャンを途中で止められてい
> ることが大きなポイントだと思います。これにより、スキャンコストだけでなく
> 結合コストも大きく削減できています。
>
> b.c6でのソートをしたうえで大幅に早くするには、テーブル設計を見直す必要が
> あるかもしれません。
>
> --
> 株式会社メトロシステムズ
> 花田 茂
> Mail : hanada @ metrosystems.co.jp
> Tel : 03-5951-1219
> Fax : 03-5951-2929
>
pgsql-jp メーリングリストの案内