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_memwork_mem = 4096
OR
work_mem = 4MB
→ 131072で3秒位になる。たぶん必要な領域がオンメモリになれば劇的に早くなるはず
8.3 + マシンをまともなのにすれば1分をきるはず