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