[pgsql-jp: 35075] Re: select のパフォーマンスについて

T.Masuda tmasuda @ msg.biglobe.ne.jp
2005年 3月 19日 (土) 15:37:00 JST


マスダです。

すみません。
バージョンを記述しておりませんでした。
バージョンは 7.3.4 です。

or に対してインデックスを使わないのですね。

確かに、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;

逆に、table1 一行につき、table2 に毎回 select を投げるので遅くなりそうな
次のSQLが早いのです。

select T1.id, (select count(*) from table2 T2 where T1.id=T2.id) as cnt
from table1 T1
where xxx...;

ほぼあきらめですが、もし、解決策をご存知の方がいらっしゃいましたら
ご教授お願い致します。


----- Original Message ----- 
From: "Yutaka tanida" <tanida @ sra.co.jp>
To: <pgsql-jp @ ml.postgresql.jp>
Sent: Saturday, March 19, 2005 2:02 PM
Subject: [pgsql-jp: 35074] Re: select のパフォーマンスについて


> 谷田です。
> 
> この種のパフォーマンス関連の話をするときはバージョンを提示して頂かないと、
> 意味のある解答が出てこないことが多いです。
> 
> On Sat, 19 Mar 2005 06:17:12 +0900
> "T.Masuda" <tmasuda @ msg.biglobe.ne.jp> wrote:
> 
>> マスダと申します。
>> 
>> 数百万行ある以下のテーブルについて、id 毎に action の数を集計しています。
>> 
>> time            id  action
>> yyyy/mm/dd..     1       A
>> yyyy/mm/dd..     1       A
>> yyyy/mm/dd..     1       B
>> yyyy/mm/dd..     2       A
>> yyyy/mm/dd..     2       B
>> yyyy/mm/dd..     2       C
>> 
>> インデックスは 「id」および「id, action」 に張っています。
>> 
>> このとき、
>>    select id, count(*) from xxx_tbl where id=1 group by id;
>> は早いのですが、
>>    select id, count(*) from xxx_tbl where id in (1, 2) group by id;
>>    select id, count(*) from xxx_tbl where id in (1, 2, ...) group by id;
>> とすると、途端に遅くなります。
>> 
>> 
>> id にはインデックスが張ってありますし、
>> 複数IDをまとめて取って来た方が早いと思うのですが、
>> 1IDづづループでまわして、複数回SQLを投げた方が、何故か早いのです。
>>
>> Oracle や SQL Server ではこんな事は無かったと思うのですが、
>> このSQLを遅くしている原因は何でしょうか。
>> また、このSQLを早くする方法はありますでしょうか。
> 
> で、バージョンは7.3以下とお見受けしましたが、いかがでしょうか?
> 
> #7.4からはOR(とか、結果的に展開されるINとか)に対してもINDEXを使うよう
> #になっているので、それでも使われないとなると全く別の答えが必要になって
> #しまいます。
> 
> 
> -- 
> Yutaka tanida <tanida @ sra.co.jp>
> 
>



pgsql-jp メーリングリストの案内