[pgsql-jp: 41481] Re: AutoCommitをfalseにするとレスポンスが遅くなる
pascalpascal @ snow.plala.or.jp
pascalpascal @ snow.plala.or.jp
2013年 7月 26日 (金) 12:15:50 JST
朝倉さん、笠原さん、MauMauさん、mlusさん
宮本です。
みなさん、ありがとうございます。
朝倉さんからご指摘いただいたように、st.setFetchSize(1000) を
なくしたところ・・・・
実行計画にHash joinが使用され、早くなりました!!!
ログの出力は、
execute <unnamed>: SELECT COUNT(*) FROM ・・・
のように、unnamedに変わっていました。
本当にありがとうございました。助かりました。
ちなみに、setFetchSizeの値をいろいろ変えてみたところ、
0だけは早く終わりました。
setFetchSize(1000) → 遅い(約3分)
setFetchSize(100) → 遅い(約3分)
setFetchSize(10) → 遅い(約3分)
setFetchSize(1) → 遅い(約3分)
setFetchSize(0) → 早い(約6秒)
setFetchSize(1000)にしていたのは、別のSQLでレスポンスが
遅かったときにこれで解決したので、他のプログラムでも
何となく共通的に入れていたのですが、これが原因とは、
思ってもみませんでした。
---- "朝倉 佑貴" <asakura.yuuki @ nttcom.co.jp> さんは書きました:
> 朝倉と申します。
> 間違っていたらすいません。
>
> FetchSizeの設定が入っているんですよね?
> FetchSizeは、AutoCommitがfalseのときだけ、
> 有効に働きます。
>
> FetchSizeを指定する→CURSORが使われるということで、
> cursor_tuple_franctionで指定した割合のレコードを取得するまでの
> 時間が最短になるように実行計画が選択されます。
>
> これで、CURSORの有効/無効の違いで、AutoCommitの
> 違いにより実行計画が異なることの説明がつきそうな気が
> しますが、いかがでしょうか。
>
>
>
>
>
>
> (2013/07/25 20:52), mlus wrote:
> > またまた関係ないかもしれませんが・・・・
> >
> >
> >> conn.setAutoCommit(false);
> >>
> >> String sql = "SELECT COUNT(*) FROM ( SELECT ・・・省略
> >>
> >> PreparedStatement st = conn.prepareStatement(sql);
> >
> >> st.setFetchSize(1000);
> > これ、なくしてみたらどうですかね?
> > // st.setFetchSize(1000);
> >
> >> st.setObject(1, "00060000");
> >> st.setObject(2, "00060000");
> >
> > あと、
> >
> > PreparedStatement prepareStatement(String sql,
> > int resultSetType,
> > int resultSetConcurrency) prepareStatement
> >
> > こっちのほう使って、一方通行カーソルと、readonly指定 とか・・・。 関係なかったらすいません。
> >
> >
>
> --
> ----------------------------------------------------
> NTTコムウェア株式会社
> 品質生産性技術本部 技術SE部
> 基盤ソフトSE・OSS部門 OSS・DB技術担当
>
> 朝倉 佑貴(asakura.yuuki @ nttcom.co.jp)
>
> 〒261-0023 千葉県千葉市美浜区中瀬1-6
> NTT幕張ビル 21F-EN
> TEL:043-211-2318 (内線:26-8239)
> ----------------------------------------------------
>
pgsql-jp メーリングリストの案内