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