[pgsql-jp: 35076] Re: select のパフォーマンスについて
Yutaka tanida
tanida @ sra.co.jp
2005年 3月 19日 (土) 16:30:10 JST
谷田です。
あと、個別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 メーリングリストの案内