[pgsql-jp: 35081] Re: select のパフォーマンスについて
T.Masuda
tmasuda @ msg.biglobe.ne.jp
2005年 3月 22日 (火) 15:11:51 JST
マスダです。
いろいろと情報有難うございました。
PostgreSQL は最近はじめたばかりなので、
explainやexplain analyze など、ご提示できなくて申し訳ありません。
> 多分お望みのケースは、以下のようなIN副問い合わせをJOINに展開する方法です。
>
> select T2.id, count(*) as cnt
> from table2 T2 INNER JOIN T1 on (T1.id=T2.id)
> where xxx... group by T2.id;
ご提示頂いた方法が、最も早いようです。
有難うございます。
...が、今回は集計する行数が100万以上と多いため、
どちらでも実用的な速度が出ず、
また 7.4 にバージョンアップしても劇的には早くならないと思いますので
設計から見直す必要がありそうです。
----- Original Message -----
From: "Yutaka tanida" <tanida @ sra.co.jp>
To: <pgsql-jp @ ml.postgresql.jp>
Sent: Saturday, March 19, 2005 4:30 PM
Subject: [pgsql-jp: 35076] Re: select のパフォーマンスについて
> 谷田です。
>
> あと、個別SQLの挙動に関する話についても、explainやexplain analyzeの結果
> を送って頂かないことには何とも言えないことが多いです。そもそもRDBMSは実
> 装によってこのへんの話は違うことが多いので、実際にどう動いているのか確か
> めないことには、他のDBの常識が通用しないことが多いです。
>
> On Sat, 19 Mar 2005 15:37:00 +0900
> "T.Masuda" <tmasuda @ msg.biglobe.ne.jp> wrote:
>
>> 確かに、in (...) に記述された id をインデックスを使って
>> ごっそり取って来れそうな次のSQLが遅く、
>>
>> select T2.id, count(*) as cnt
>> from table2 T2
>> where T2.id in (select T1.id from table1 T1 where xxx...)
>> group by T2.id;
>
> これは、T2の各行に対して副問い合わせを評価するため、典型的な遅いSQLの一
> 例です。
>
>> 逆に、table1 一行につき、table2 に毎回 select を投げるので遅くなりそうな
>> 次のSQLが早いのです。
>>
>> select T1.id, (select count(*) from table2 T2 where T1.id=T2.id) as cnt
>> from table1 T1
>> where xxx...;
>
> 多分お望みのケースは、以下のようなIN副問い合わせをJOINに展開する方法です。
>
> select T2.id, count(*) as cnt
> from table2 T2 INNER JOIN T1 on (T1.id=T2.id)
> where xxx... group by T2.id;
>
>
>> ほぼあきらめですが、もし、解決策をご存知の方がいらっしゃいましたら
>> ご教授お願い致します。
>
> さっきの件と含めて、7.4の典型的なパフォーマンス改善項目ですから、バージョ
> ンアップするのが一番早いのではないでしょうか?
>
> --
> Yutaka tanida <tanida @ sra.co.jp>
>
>
pgsql-jp メーリングリストの案内