[pgsql-jp: 41697] Re: nestloop時の動作について
prod2011 @ yahoo.co.jp
prod2011 @ yahoo.co.jp
2014年 7月 23日 (水) 13:08:15 JST
自己レスです。
結果がタブなくなってしまって、すごく見ずらい
状態でした。申し訳ございません。
結果の部分を整形したものを再度送ります。
nestloop時の実行結果
> syoid anycd no015 dataid
> 201400009301 67458 2 169939
> 201400009301 67458 2 169943
> 201400009301 67458 2 169947
> 201400009301 67458 2 169951
> 201400009301 67458 1 169956
> 201400009301 67458 1 169960
> 201400009301 67458 1 169964
> 201400009301 67458 1 169968
set enable_nestloop = off;
しての実行結果。
ちなみに、hashjoin でした。
> syoid anycd no015 dataid
> 201400009301 67458 2 169935
> 201400009301 67458 2 169935
> 201400009301 67458 2 169935
> 201400009301 67458 2 169935
> 201400009301 67458 1 169936
> 201400009301 67458 1 169936
> 201400009301 67458 1 169936
> 201400009301 67458 1 169936
以上
よろしくお願いいたします。
----- Original Message -----
> From: "prod2011 @ yahoo.co.jp" <prod2011 @ yahoo.co.jp>
> To: "pgsql-jp @ ml.postgresql.jp" <pgsql-jp @ ml.postgresql.jp>
> Cc:
> Date: 2014/7/23, Wed 11:14
> Subject: [pgsql-jp: 41696] nestloop時の動作について
>
> こんにちは。Prodと申します。
>
> 今回あるSQLで、オプティマイザの実行計画により、結果が異なる。
> という事象に遭遇しました。
> 実行計画で、結果がことなるのは、
> Postgresの不具合なのでは?と思い、皆様に見ていただきたいとおもい
> メールさせていただきました。
>
> OS:RedhatES 5.3
> Postgres:PostgreSQL 9.1.2
>
> 実際のSQL-------------------------------------------
> select
> dt.syoid,dt.anycd,dt.NO015,dt.dataid
> from
> wrk_tri wtri
> inner join
> (
> SELECT
> wrk.syoid
> ,nextval('seq_dataid') as dataid
> ,CONCAT(1407 ) AS denno
> ,wrk.anycd AS anycd
> ,wrk.no015 AS no015
> FROM
> wrk_tri wrk
> WHERE wrk.syoid = 201400009301
> AND wrk.anycd = '67458'
> AND wrk.ykofg <= 1
> GROUP BY wrk.syoid,wrk.anycd,wrk.no015
> ) dt
> on (wtri.syoid = dt.syoid AND wtri.anycd = dt.anycd AND wtri.no015 = dt.no015)
> where wtri.anycd = '67458'and wtri.syoid = 201400009301
> order by dt.dataid
> --------------------------------------------------------
>
> dataidをsyoid,anycd,no015単位で、シーケンスにより採番するために作成しました。
> 副問合せの中身も、外側でJoinしているテーブルも同じテーブルです。
> ※ 本来は、Updateしているのですが、selectでも同じ事象になったので、
> selectの方で質問しております。
>
> こちらを実行すると、
> syoid anycd no015 dataid
> 201400009301674582169939
> 201400009301674582169943
> 201400009301674582169947
> 201400009301674582169951
> 201400009301674581169956
> 201400009301674581169960
> 201400009301674581169964
> 201400009301674581169968
>
> と副問合せ部分で取得したdataidのシーケンスばバラバラとなります。
> 副問合せの部分で、syoid,anycd,no015でGroup byしておりますので、
> 期待した動作は、syoid,anycd,no015単位に同じdataidが取得するということです。
>
> 上記SQLの実行計画は、nestloopでしたので、
> ここで、
> set enable_nestloop = off;
>
> として、もう一度試すと、
>
> syoid anycd no015 dataid
> 201400009301674582169935
> 201400009301674582169935
> 201400009301674582169935
> 201400009301674582169935
> 201400009301674581169936
> 201400009301674581169936
> 201400009301674581169936
> 201400009301674581169936
>
>
> とsyoid,anycd,no015単位に同じdataidが取得できました。
>
> SQL自体全く変更していないのに、実行計画で、
> 結果が異なるのはpostgresの不具合では?
> と感じるのですが、そもそもこんなSQLは使ってはいけない。
> などありましたら、ご教授いただければ幸いです。
>
> よろしくお願いします。
>
pgsql-jp メーリングリストの案内