8. clustered index を作って比較 - PostgreSQL のソースコードを読む
1000 万件のデータが入った以下の person テーブル。age は 0 - 99 まで 10 万件ずつ一様に分布。(同一ページに同一 age が固まらないように insert)
test=# \d person Table "public.person" Column | Type | Modifiers -----------+---------+----------- social_no | integer | not null name | text | age | integer | uri | text | Indexes: "person_pkey" PRIMARY KEY, btree (social_no) "person_age" btree (age)
まずは clustered index がない状態で
select * from person where age > 49 limit 100000;
おおよそ 300 msec で帰ってくる。
Cluster コマンドで clustered index にする。
cluster person_age on person;
700 MB サイズのテーブルで、373秒。この間ロックがかかるのは微妙だ。まあ実データのディスク上の位置を変えているのだから気持ちは分かる。
\d で CLUSTER マークがついた。
Indexes: "person_pkey" PRIMARY KEY, btree (social_no) "person_age" btree (age) CLUSTER
同じ query を投げてみる。
select * from person where age > 49 limit 100000;
おおよそ 200 msec くらい。
所感
- range search だからもっと劇的に効果があると思ったがそうでもなかった
- clustered index でなくても、buffer pool にうまくヒットしてそこまで I/O が多くなかったのかもしれない
- clustered Index は使いどころを間違わなければやはり速い
- CLUSTER コマンドはロックした状態で結構時間がかかるので慎重に。