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