[pgsql-jp: 28827] Re: 集計処理を快適にしたい

桝形 誠二 s.masugata @ digicom.dnp.co.jp
2003年 1月 29日 (水) 11:51:29 JST


桝形です。
返答が遅れまして、申し訳ありません。

> はずしているかもしれませんが、逆にtest4_no2_index_keyが
> 足を引っ張っているということはないでしょうか?
> 
> インデックスが効くのは全体から一部を抜き出すときで、
> このケースのように全件の集計の時にはむしろ速度が
> 落ちるような気がします。
> 
> vaccumdb <db名> --analyze
> 
> して統計情報を溜め込んでもまだインデックスを使うプランに
> なるでしょうか?

コマンドラインで

vacuumdb -a -f -z

を実行して、EXPLAIN実行結果を取得した結果は下記になります。

 Sort  (cost=1.31..1.33 rows=5 width=6)
   Sort Key: cnt
   ->  Subquery Scan test  (cost=0.00..1.26 rows=5 width=6)
         ->  Limit  (cost=0.00..1.26 rows=5 width=6)
               ->  Aggregate  (cost=0.00..25115.00 rows=100000 width=6)
                     ->  Group  (cost=0.00..22615.00 rows=1000000 width=6)
                           ->  Index Scan using test4_no2_index_key on test4  (cost=0.00..20115.00 rows=1000000 width=6)

まだ、インデックスを使うプランになっているようです。

> また、test4_no2_index_keyをドロップしてやってみると
> どうなるでしょうか?

インデックスを削除してから、コマンドラインで下記を実行しました。

vacuumdb -a -f -z

その後の、EXPLAIN実行結果は下記になります。

explain
select * from (
               select no2, count( * ) as cnt from test4
               group by no2 offset 0 limit 5
              ) as test
order by cnt desc;

 Sort  (cost=151098.28..151098.29 rows=5 width=6)
   Sort Key: cnt
   ->  Subquery Scan test  (cost=151097.84..151098.22 rows=5 width=6)
         ->  Limit  (cost=151097.84..151098.22 rows=5 width=6)
               ->  Aggregate  (cost=151097.84..158597.84 rows=100000 width=6)
                     ->  Group  (cost=151097.84..156097.84 rows=1000000 width=6)
                           ->  Sort  (cost=151097.84..153597.84 rows=1000000 width=6)
                                 Sort Key: no2
                                 ->  Seq Scan on test4  (cost=0.00..16370.00 rows=1000000 width=6)

インデックスは使われなくなりましたが、インデックスを張っていた方が
早いようです。
実際にデータを取得するのに60秒くらいかかって約2倍の差となりました。

前回のメールでは、「それぞれのやり方があるのですね」という返答を
致しましたが、まだ納得できずに、例えば、色は10個しかないんだから、

select count( * ) from test4 where no2 = '赤';
select count( * ) from test4 where no2 = '青';

と、それぞれの色をカウントしてテンポラリテーブルに入れて、その中で
上位5件を抽出したりとか裏で粘っていましたが、それでもまだまだ差は
は縮まりそうにないようです。

上記の単純なクエリでも得られる結果量が多いと、インデックスで部分的に
高速に抽出できても、件数を数える部分で負荷がかかっている?

総合的には、今のところ一番最初のクエリが一番よいようです。

しつこいですね、すみません。(^^;
返答して頂き、ありがとうございます。
_______________________

   桝形 誠二( Masugata Seiji )
   E-Mail : s.masugata @ digicom.dnp.co.jp

 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄




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