[pgsql-jp: 41696] nestloop時の動作について
prod2011 @ yahoo.co.jp
prod2011 @ yahoo.co.jp
2014年 7月 23日 (水) 11:14:10 JST
こんにちは。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 メーリングリストの案内