[pgsql-jp: 29731] Re: substring を使用した場合の検索結果について

Makoto,Yui yuin @ bb.din.or.jp
2003年 4月 25日 (金) 23:44:56 JST


油井です.

On Fri, 25 Apr 2003 19:54:21 +0900
"Hirokazu Matsumura" <matsumurah @ citizen.co.jp> wrote:

> 現在、MSDE(SqlServer)から、PostgreSQLへ移行を行っております。
> しかし、Select文での検索が非常に遅くて困っております。
> (同一SQLにて、SqlServerでは数秒のものがPostgreSQLでは数十秒かかる)

DBMSの使用するメモリの割り当て量なども一緒ですか?

> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
> 実行結果2
> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
> explain analyze
> select *
> from test01
> where substring(test01,1,9) = '99XXX';
> Seq Scan on test01  (cost=0.00..1191.36 rows=108 width=238)
>  (actual time=175.69..345.42 rows=1 loops=1)
>    Filter: ("substring"((col1)::text, 1, 9) = '99XXX'::text)
>  Total runtime: 345.73 msec
> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
> と、以上の様になっておりました。
> 実行速度が遅いのは、substring関数を使用しているからなのか?
> とも思うのですが、検索方法が「Index -> Seq」になってしまっている
> のが何故かわかりません。
> (これもsubstring関数を使用している事と関係が有るのでしょうか?)

この場合は取り敢えず, 関数インデックスを使わなければならないと思います.
http://developer.postgresql.org/docs/postgres/indexes-functional.html

コストの見積もりが, 
cost=0.00..1191.36 rows=108 width=238
に対して, 実際の結果が
actual time=175.69..345.42 rows=1 loops=1
となっていますが, 統計情報の更新(analyze)は行ないましたか?
#SET STATISTICS xxして, より詳細な統計と取ったりもできます..

確か結構前のバージョンからか, vacuumとanalyzeは別になったとか聞いたような..

あと, vacuumも単にvacuumでなくて, _一度_, vacuum full(排他的ロックがかかります)すると
物理的に縮小される(ケースもある)ので, 微妙に早くなるかも知れません.


+-------------------------------------------------------------------+
Makoto Yui <yuin @ bb.din.or.jp>
Key fingerprint = 6462 E285 97D8 1323 40C4  F9E5 EB0F 9DE6 1713 219E
+-------------------------------------------------------------------+



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