[pgsql-jp: 28810] Re: 集計処理を快適にしたい
Tamotsu Ebina
ebina @ pluto.dti.ne.jp
2003年 1月 28日 (火) 18:58:41 JST
海老名@インフォテック
直接の答えでは有りませんが。
どんな方法でもgroup by を使ったら同じだと思います。
単に投票を集計したいなら、集計用に
10件のrowを持つ別のテーブルを作成し
update count_table
set entry_count = entry_count +1
where entry_color = '赤';
等でカウントアップして行くだけではだめですか?
何故わざわざ100万件もinsetさせてから集計するのか
理由がよく分かりません。
投票した人のIDを記録する必要があるのなら、
test4テーブルにinsert 後 count_table をupdate
すればよいと思います。
SQL文は2回出ますがレコード件数は10件増えるだけで
処理速度は問題にならないと思います。
----- Original Message -----
From: "桝形 誠二" <s.masugata @ digicom.dnp.co.jp>
To: <pgsql-jp @ ml.postgresql.jp>
Sent: Tuesday, January 28, 2003 6:01 PM
Subject: [pgsql-jp: 28803] 集計処理を快適にしたい
> こんにちわ、桝形です。
>
> 10個の色の中から、どの色が一番いいのかを投票してもらって
> その結果を集計し、上位5位までを表示するクエリを作成して
> いるのですが、快適にできず、逆にえらい事になっています。
>
> 【PostgreSQL】
>
> 7.3.1( SunOS5.6 )
>
> 【テーブル構造】
>
> CREATE TABLE test4
> (
> no1 INT NOT NULL,
> no2 VARCHAR(100) NOT NULL
> );
>
> CREATE INDEX test4_no1_index_key ON test4( no1 );
> CREATE INDEX test4_no2_index_key ON test4( no2 );
>
> 【データ】
>
> INSERT INTO test4 VALUES( 1, '赤' );
> INSERT INTO test4 VALUES( 1, '赤' );
> INSERT INTO test4 VALUES( 1, '赤' );
> INSERT INTO test4 VALUES( 1, '赤' );
> INSERT INTO test4 VALUES( 2, '赤' );
> INSERT INTO test4 VALUES( 2, '赤' );
> INSERT INTO test4 VALUES( 3, '青' );
> INSERT INTO test4 VALUES( 3, '青' );
> INSERT INTO test4 VALUES( 3, '青' );
> INSERT INTO test4 VALUES( 3, '青' );
> INSERT INTO test4 VALUES( 4, '黒' );
> INSERT INTO test4 VALUES( 4, '黒' );
> ↑ ↑
> 投票した人のID 投票した色
>
> 以下、延々と100万件まで続く。
>
> 上記の環境でテーブル構造及びデータになっています。
>
> ただ、テーブル構造等に関してはこだわっている訳ではなく
> もっとよい構造であればそれでも構いません。
>
> 問題のクエリですが、
>
> select * from (
> select no2, count( * ) as cnt from test4
> group by no2 offset 0 limit 5
> ) as test
> order by cnt desc;
>
> データ量が100万件あるので、上記のSQLでは結果的に全件
> 見にいって遅くなっているという事なんでしょうか?
> ( 最後に上位5件を抽出しているので )
>
> 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_idndex_key on test4 (cost=0.00..20115.00
rows=1000000 width=6)
>
> もっとよいやり方を知っておられる方は、大変お手数ですが
> ご教授願います。よろしくお願いします。
> _______________________
>
> 桝形 誠二( Masugata Seiji )
> E-Mail : s.masugata @ digicom.dnp.co.jp
>
>  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
>
pgsql-jp メーリングリストの案内