PostgreSQL ランキング作成

PostgreSQLでトップN分析 オプション
http://groups.google.co.jp/group/fj.comp.databases/browse_thread/thread/2392ba2f92b6666f/5ee2beb759678e12?hl=ja

適当にやってみた

CREATE TEMP SEQUENCE seq_score;

CREATE TABLE workw AS
SELECT NEXTVAL('seq_score'), userid, score
FROM (SELECT userid, score
FROM userid
ORDER BY score) userid;

DROP SEQUENCE seq_score;

インデックス貼ってあると、27万件で5秒かからないくらいでテーブルが作成できる (Celeron)
同着がなければかなり使える。

さすがに問い合わせごとだと実用にたえないと思うけど
ランキング更新は10分に1回とかなら現実的。

2007/11/30 追記
ソートメモリ増やすと速度上がる?

http://www.stackasterisk.jp/tech/dataBase/postgresTuning01_04.jsp

●ソートメモリ(sort_mem)
ソートを行うための作業領域のサイズを設定します。単位は KByte です。ソート作業で必要な領域がここでの設定値を超えると、一時ファイルへの書き出しが行われ、パフォーマンスに悪影響を及ぼします。
ソートメモリは下記の処理中に使用されます。

ORDER BY
Merge Join
CREATE INDEX

http://yassu.jp/pukiwiki/index.php?PostgreSQL%A4%CE%A5%C1%A5%E5%A1%BC%A5%CB%A5%F3%A5%B0

work_mem †
ソートバッファでテーブルの結合、ソート時に利用される
PostgreSQL8より前は sort_mem

work_mem = 4096
OR
work_mem = 4MB

→ 131072で3秒位になる。たぶん必要な領域がオンメモリになれば劇的に早くなるはず
8.3 + マシンをまともなのにすれば1分をきるはず