[pgsql-jp: 33390] Re: 重複しているサブクエリーの省略
Mashiki
mashiki @ yanah.com
2004年 6月 26日 (土) 13:32:56 JST
Mashikiです。
>以下のSQL文の重複したサブクエリーをどうにかして一つにしてムダを省きたいので
>すが
>やり方がわかりません。一つめのサブクエリーをテーブル全体にする方法も
>あるのですが、データー量が100万行を超えているため現実的でないと考えています。
>わかる方がいらっしゃいましたら、教えてください。
>
>バージョンは PostgreSQL 7.3 on i686-pc-linux-gnu, compiled by GCC 2.96 です
>
>select hoge3.d1,hoge3.d2,hoge3.name,hoge3,d3
>from (select d1,d2,name,d3 from hoge where d2!=3) as hoge3
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> ,(select name,max(d3) from
> (select d1,d2,name,d3 from hoge where d2!=3) as hoge1
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> group by name) as hoge2
>where hoge3.name=hoge2.name and
> hoge3.d3=hoge2.d3;
私はこのような場合でパフォーマンスが得られないとき、一時テーブルを
使うようにしています。
また2つの別のSQLで共通のサブクエリーを使う場合にもパフォーマンス的に
有効になるケースが多いかと思います。
CREATE TEMP TABLE hoge3 AS
SELECT d1,d2,name,d3 FROM hoge WHERE d2!=3;
select hoge3.d1,hoge3.d2,hoge3.name,hoge3,d3
from hoge3
,(select name,max(d3) from hoge3 group by name) as hoge2
where hoge3.name=hoge2.name and
hoge3.d3=hoge2.d3
;
また一時テーブルにインデクスを張ることで、トータルの実行時間を
削減できるケースもあるかと思います。
一時テーブルはそのセッションのみ有効なテーブルです。
参考まで。
pgsql-jp メーリングリストの案内