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