[pgsql-jp: 28803] 集計処理を快適にしたい
桝形 誠二
s.masugata @ digicom.dnp.co.jp
2003年 1月 28日 (火) 18:01:06 JST
こんにちわ、桝形です。
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 メーリングリストの案内