[pgsql-jp: 37063] Re: SELECT の性能

YAMANEKO/Mao yneko2 @ yamamaya.com
2006年 5月 17日 (水) 11:41:19 JST


もりもとです

どなたも指摘されていないようなので、
基本中の基本とは思いますが、念のため・・・・

VACUUM ANALYZE あるいは
ANALYZE は、されてますよね。。??

PostgreSQLでは、クエリプランナーが必要とする統計情報は、
ANALYZEを実行するまで変更されません。
なので、実際のデータを入れてから ANALYZE することが、
正しいクエリプランのためには必要不可欠です。
(ANALYZEを実行したときに入っているデータによっては、
インデックススキャンが使われるようになったり、
シーケンシャルスキャンが使われるようになったり・・・これはこれで、
厄介なのですが。。)

- YAMANEKO / Mao
http://blog.yamamaya.com/
http://yamamaya.com/

----- Original Message ----- 
From: "河本陽一" <komoto.yoichi @ kcc.co.jp>
To: "PostgreSQL Japanese Mailing List" <pgsql-jp @ ml.postgresql.jp>
Sent: Wednesday, May 17, 2006 11:23 AM
Subject: [pgsql-jp: 37061] Re: SELECT の性能


> こうもとです。
>
> psql_aby さんの書いたこと:
>> joinをやめてサブクエリーを利用したものはどうでしょうか?
>>
>> SELECT t1.*,
>>        (select f2 from t2
>>          WHERE f1 = t1.f1
>>            AND f2='xxx') f2
>>   FROM t1
>>  WHERE f3=0
>>    AND t1.f4=false
>>    AND f5 IS NOT NULL
>>  ORDER BY f6 DESC LIMIT 300;
>
>  この方法を試してみましたが、f2='xxx'の条件にあっていないレコードは
> その部分がNULLとなるだけで、ほしい結果とは違いました。
>
>
>  サブクエリーを利用ということで、以下のようにやってみましたが、プラ
> ンは最初のものと変わりませんでした。
>
> SELECT * FROM t1, (select * from t2 where f2='xxx') as t2a WHERE
t1.f1=t2a.f1 and f3=0 AND t1.f4=false AND f5 IS NOT NULL ORDER BY f6 DESC
LIMIT 300;
>
>
>  なんか、最初に根岸さんの出された案のように、シーケンシャルスキャン
> をさせない方法が一番よいのではないかと思ってきました。
>
> ======================================================================
> 河本陽一(こうもとよういち)
> mailto:komoto.yoichi @ kcc.co.jp
>
>




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