[pgsql-jp: 31981] Re: countが以上に遅い。

TANIDA Yutaka tanida @ sra.co.jp
2004年 1月 13日 (火) 13:32:51 JST


谷田です。

On Tue, 13 Jan 2004 13:12:25 +0900
小野昇一 <ono @ searchina.ne.jp> wrote:

> ・以下explain analyzeの結果です。
> 	news=# EXPLAIN ANALYZE select count(*) from news_table ;
> 	NOTICE:  QUERY PLAN:
> 
> 	Aggregate  (cost=148292.30..148292.30 rows=1 width=0) (actual
> 	time=58467.49..58467.49 rows=1 loops=1)
> 	  ->  Seq Scan on news_table  (cost=0.00..148284.64 rows=3064 width=0) (actual time=56874.44..58198.89 rows=21239 loops=1)
> 	Total runtime: 58467.58 msec
> 	
> 	EXPLAIN

非常に大きなデータが大量に格納されているテーブルのようですね。一件平均
50kですか?これだけ大きいデータを格納していると、count(*)のような検索で
パフォーマンスを向上させるのは至難の業です。

もし、平均データ量がこんなに大きくないというなら、vacuum fullをする頃合
いではないかと思います。また、analyzeしているというにもかかわらずコスト
計算にひずみが出ている(rows=3064の予想に対してrows=21239の結果)ので、ひょっ
とすると"vacuum full analyze"で何らかの改善が見られるかもしれません。

テーブル定義を変更しても良いというのであれば、このテーブルから大きなデー
タのみを切り離すのが一番です。例えば、最初のテーブル定義のうちmessageだ
けが飛び抜けて大きいと仮定するなら、messageとuniqidを切り出して1テーブ
ルとし、messageが必要な場合だけJOINを使って取り出すという感じです。


-- 
TANIDA Yutaka <tanida @ sra.co.jp>




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