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