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